我正在尝试使用带有RSpec的法拉第编写一个调用API的测试。调用是在.execute方法中,它在生产中正常工作,但在测试中,我遇到了这个错误:
Failure/Error: @response ||= conn.post '/oauth/token', @params
Faraday::ConnectionFailed:
Failed to open TCP connection to :80 (Connection refused - connect(2) for nil port 80)
测试就像这样
it 'access_token should not be nil' do
@auth = AuthenticateService.new(params)
auth_exec = @auth.execute
access_token = auth_exec[:access_token]
expect(access_token.present?).not_to be_empty
end
我是否需要配置一些东西以使法拉第与测试一起工作?
答案 0 :(得分:1)
它实际上是在试图调用局外人请求。 在你的情况下,有两种解决方案:
before do
allow_any_instance_of(AuthenticateService).to receive(:execute).and_return(access_token: 'some token')
end
您可以尝试使用gem vcr。它会将您的外部请求记录到
cassette
中,并在规则运行中播放。
干杯!
答案 1 :(得分:0)
因为在测试模式下,你设置了url
,我可以在我的pry控制台中重播确切的错误:
> conn = Faraday.new();
> conn.post '/oauth/token';
Faraday::ConnectionFailed: Connection refused - connect(2) for nil port 80
from /home/fangxing/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/net/http.rb:879:in `initialize'
我认为在你的项目中,为法拉第配置了一个变量url
,你没有在测试模式下配置它。
答案 2 :(得分:0)
还有一种称为Webmock的东西,它可以模拟API调用并返回您预定义的响应。你应该调查一下!
我比VCR好得多,VCR在处理大量数据或多个API调用时可能会很讨厌。
答案 3 :(得分:0)
我对类似问题的解决方案:
var postedFile = Request.Files.FirstOrDefault();
您可以通过替换以下内容来加强验证:
stub_request(method, url).with(
headers: { 'Authorization' => /Basic */ }
).to_return(
status: status, body: 'stubbed response', headers: {}
)