我的模型看起来像这样:
class Gist
def self.create(options)
post_response = Faraday.post do |request|
request.url 'https://api.github.com/gists'
request.headers['Authorization'] = "Basic " + Base64.encode64("#{GITHUB_USERNAME}:#{GITHUB_PASSWORD}")
request.body = options.to_json
end
end
end
和一个看起来像这样的测试:
require 'spec_helper'
describe Gist do
context '.create' do
it 'POSTs a new Gist to the user\'s account' do
Faraday.should_receive(:post)
Gist.create({:public => 'true',
:description => 'a test gist',
'files' => {'test_file.rb' => 'puts "hello world!"'}})
end
end
end
这个测试并不能真正满足我,因为我正在测试的是我正在用法拉第进行一些POST,但我实际上无法测试URL,标题或正文,因为它们是传了一个街区。我尝试使用法拉第测试适配器,但我也没有看到任何方法测试URL,标题或正文。
有没有更好的方法来编写我的Rspec存根?或者我能否以某种方式使用法拉第测试适配器?我无法理解?
谢谢!
答案 0 :(得分:9)
您可以使用优秀的WebMock库来存根请求并测试已提出请求的期望,see the docs
在您的代码中:
Faraday.post do |req|
req.body = "hello world"
req.url = "http://example.com/"
end
Faraday.get do |req|
req.url = "http://example.com/"
req.params['a'] = 1
req.params['b'] = 2
end
在RSpec文件中:
stub = stub_request(:post, "example.com")
.with(body: "hello world", status: 200)
.to_return(body: "a response to post")
expect(stub).to have_been_requested
expect(
a_request(:get, "example.com")
.with(query: { a: 1, b: 2 })
).to have_been_made.once
答案 1 :(得分:7)
我的朋友@ n1kh1l向我指出and_yield
Rspec方法和this SO post让我按照这样写我的测试:
require 'spec_helper'
describe Gist do
context '.create' do
it 'POSTs a new Gist to the user\'s account' do
gist = {:public => 'true',
:description => 'a test gist',
:files => {'test_file.rb' => {:content => 'puts "hello world!"'}}}
request = double
request.should_receive(:url).with('https://api.github.com/gists')
headers = double
headers.should_receive(:[]=).with('Authorization', "Basic " + Base64.encode64("#{GITHUB_USERNAME}:#{GITHUB_PASSWORD}"))
request.should_receive(:headers).and_return(headers)
request.should_receive(:body=).with(gist.to_json)
Faraday.should_receive(:post).and_yield(request)
Gist.create(gist)
end
end
end
答案 2 :(得分:0)
我的解决方案:
stub_request(method, url).with(
headers: { 'Authorization' => /Basic */ }
).to_return(
status: status, body: 'stubbed response', headers: {}
)
使用gem 网络模拟
您可以通过替换以下内容来加强验证:
/Basic */ -> "Basic #{your_token}"