Cec*_*ang 2 ruby rspec mocking request stubbing
我正在注册请求存根,如下所示:
url = "http://www.example.com/1"
stub_request(:get, url).
with(body: "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project>\n <id>1</id>\n</project>\n",
headers: {
'Accept' => 'application/xml',
'Content-type' => 'application/xml',
'User-Agent' => 'Ruby',
'X-Trackertoken' => '12345'
}).
to_return(status: 200, body: '', headers: {})
Run Code Online (Sandbox Code Playgroud)
出于某种原因,当我运行时bundle exec rspec spec,我的规格未能说该请求尚未注册.注册的存根就是这个,
stub_request(:get, "http://www.example.com/1").
with(body: "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project>\n <id>1</id>\n</project>\n",
headers: {
'Accept' => 'application/xml',
'Content-type' => 'application/xml',
'User-Agent' => 'Ruby',
'X-Trackertoken' => '12345'
})
Run Code Online (Sandbox Code Playgroud)
请注意该to_return部分缺失
我尝试用body空字符串替换标头,请求存根被正确注册但是我的规格仍然会失败,因为他们期望除了空字符串之外的身体有一些值.因此,为身体赋值是非常重要的.
在我的规范中,我称这种方法:
def find(id)
require 'net/http'
http = Net::HTTP.new('www.example.com')
headers = {
"X-TrackerToken" => "12345",
"Accept" => "application/xml",
"Content-type" => "application/xml",
"User-Agent" => "Ruby"
}
parse(http.request(Net::HTTP::Get.new("/#{id}", headers)).body)
end
Run Code Online (Sandbox Code Playgroud)
有关为什么会发生这种情况的任何想法?
谢谢.
问题是你的存根匹配GET请求与非空体<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project>\n <id>1</id>\n</project>\n,但是当你发出请求时你没有包含任何正文,所以它找不到存根.
我觉得你对这里的身体是什么感到困惑.在身体with方法参数是身体要求你正在,而不是身体反应.你可能想要的是这样的存根:
url = "http://www.example.com/1"
stub_request(:get, url).
with(headers: {
'Accept' => 'application/xml',
'Content-type' => 'application/xml',
'User-Agent' => 'Ruby',
'X-Trackertoken' => '12345'
}).
to_return(status: 200,
body: "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project>\n <id>1</id>\n</project>\n",
headers: {})
Run Code Online (Sandbox Code Playgroud)