【发布时间】: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