在rspec中遇到法拉第

时间:2017-11-21 01:32:24

标签: ruby-on-rails ruby rspec

我正在尝试使用带有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

我是否需要配置一些东西以使法拉第与测试一起工作?

4 个答案:

答案 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: {}
)