Webmock没有正确注册我的请求存根

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)

有关为什么会发生这种情况的任何想法?

谢谢.

Chr*_*erg 6

问题是你的存根匹配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)