我是VCR vcr gem的新手,正在Rails应用程序中对其进行测试。我面临的问题是我无法使用VCR接收Flash消息和重定向,并且不确定如何解决它。这是我要创建的控制器操作。
def create
@response = HTTParty.post('https://reseller.cdnify.com/api/v1/resources',
{basic_auth: { username: cdn_params[:api_key], password: 'x'}, body: { alias: cdn_params[:resource_name], origin: cdn_params[:resource_origin]}})
if @response.parsed_response['resources']
flash[:notice] = 'Successfully Created Resource.'
else
@response.parsed_response['errors'].each do |error|
flash[:error] = "#{error['code']}" + ': ' + "#{error['message']}"
end
end
redirect_to cdns_path(ssl_slug: @ssl_slug)
end
我的controller_test.rb
文件中有以下测试:
describe 'create' do
let(:cdn_resource) do
HTTParty.post('https://reseller.cdnify.com/api/v1/resources', {
basic_auth: { username: 'api_key', password: 'x'},
body: { alias: 'somewebsite', origin: 'http://www.somewebsite.com' }
})
end
it "returns a succesful response for cdnify request" do
VCR.use_cassette('cdnify_valid_result_for_cdn') do
response = HTTParty.post('https://reseller.cdnify.com/api/v1/resources', {
basic_auth: { username: 'api_key', password: 'x'},
body: { alias: 'mywebsite', origin: 'http://www.mywebsite.com' }
})
assert_not_nil response.parsed_response['resources']
assert_nil response.parsed_response['errors']
end
end
it 'returns an error with an invalid cdnify request' do
VCR.use_cassette('cdnify_invalid_result_for_cdn') do
response = cdn_resource
assert_not_nil response.parsed_response['errors']
assert_nil response.parsed_response['resources']
end
end
end
基本上,我正在测试一个好的和坏的响应。这些测试通过了,但是我遇到的问题是我无法测试重定向或Flash消息。我尝试将它们放在VCR
do块中和块外,但无法通过测试。他们似乎不见了。我究竟做错了什么?此外,我的simplecov
覆盖范围是说我没有执行create
方法中的任何代码。为什么会这样?
正如mrzasa所提到的,我将服务分离到一个服务文件夹中,但是现在我只是缺少测试过程中的一个关键小步骤。我是要用mocha来模拟http响应,还是可以仅使用生成的卡带来模拟它?
describe 'create' do
it 'correctly creates a cdn resource, redirects to cdns#index, and shows successful flash message' do
post :create, params: {api_key: 'random_api_key_12345678',
resource_name: 'somewebsite',
resource_origin: 'http://www.somewebsite.com' }
############ mocking here? #############
Do I use mocha to construct the actual response hash?
####################################################
assert flash[:notice]
end
end
答案 0 :(得分:2)
这不是此问题的直接答案,但总体上可能会有所帮助。我不鼓励您直接从控制器调用外部服务。太乱了很难测试。不可能重复使用。
将cdnify集成包装在单独的类中。您将能够使用VCR测试此类。在控制器规格中,您将对其进行模拟并轻松测试闪存。
答案 1 :(得分:0)
simplecov的覆盖范围是说我没有执行create方法中的任何代码。为什么会这样?
您的测试没有达到您的控制器。您需要添加一行类似于post :create, params: {}
的行。