【问题标题】:FactoryGirl used with webmockFactoryGirl 与 webmock 一起使用
【发布时间】:2016-02-21 11:38:21
【问题描述】:

我的工厂有一个url 字段(用于获取 youtube 嵌入视频):

factory :commercial do
    url 'https://www.youtube.com/watch?v=BTTygyxuGj8'
end

在我的测试中,我试图模拟对 youtube 的请求。我在spec_helper 中添加了以下内容:

require 'webmock/rspec'
WebMock.disable_net_connect!(allow_localhost: true)

RSpec.configure do |config|
  config.before(:suite) do
    mock_request
  end
end

def mock_request
  response = {
    author_name: 'Confreaks',
    # more attributes omitted ..
  }
  WebMock.stub_request(:get, /.*youtube.*/).
    to_return(status: 200, body: response.to_json, headers: {})
end

在 rspec 配置中注册一次 webmock 是否足以使存根在整个测试套件中可用?为什么我必须对我的工厂这样做:

factory :commercial do
  url 'https://www.youtube.com/watch?v=BTTygyxuGj8'

  after(:build) do |commercial|
    mock_request
  end
end

如果没有after(:build),我会收到以下错误:

失败/错误:create(:commercial, WebMock::NetConnectNotAllowedError: 真正的 HTTP 连接被禁用。未注册的请求:...告诉我 关于对 youtube 的未注册请求以及我应该如何存根它......

【问题讨论】:

  • 你有想过这个吗?现在看到同样的事情。在命中 API 端点的模型上添加验证。 Webmock 存根未注册,但它确实在符合相同验证的功能规范中工作。
  • 在此之后:robots.thoughtbot.com/… 在 spec_helper 我将 before(:suite) 更改为 before(:each)。它似乎不会影响测试运行时间,但是我对这个解决方案并不感到非常自豪。
  • 嗯,我已经将我的设置为before(:each)。对我来说,解决方案是在 AR 验证中删除 API 请求。我对此感觉很好,因为我认为这是正确的设计决定,但我想了解 FG 问题中 webmock 的底层为什么。更多信息在这里:github.com/18F/dolores-landingham-bot/pull/…

标签: ruby-on-rails rspec stub webmock


【解决方案1】:

to_return 呼叫帮助中是否填写标题?

.to_return(
  ...,
  headers: { "Content-Type" => "application/json; charset=utf-8" }
)

用失败输出提供的值填充散列。

【讨论】:

  • 对不起,juanitofatas。我已经尝试过了,它没有任何区别。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-17
相关资源
最近更新 更多