ruby-on-rails - 使用 vcr gem 时如何测试我的 Flash 消息?
问题描述
我是 VCR vcr gem的新手,并在 rails 应用程序中对其进行了测试。我面临的问题是我无法使用 VCR 接收我的闪存消息和重定向,我不知道如何解决它。这是我正在尝试创建的控制器操作。
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
解决方案
这不是这个问题的直接答案,但总体上可能会有所帮助。我不鼓励您直接从控制器调用外部服务。很乱。很难测试。重复使用是不可能的。
将 cdnify 集成包装在一个单独的类中。您将能够使用 VCR 测试该课程。在控制器规范中,您将对其进行模拟并轻松测试闪存。
推荐阅读
- c# - 加载表单时从 EntityModel WPF 中选择的 ComboBox 值
- hyperledger-fabric - Hyperledger Fabric 问题和疑惑
- c# - 获取 xml 标签的值
- sql - 如何在sql server中选择连续日期
- typescript - 简单的绝对导入导致“找不到模块”错误
- reactjs - 变量不会在组件上更新
- mysql - 没有得到行的总和
- r - 数据帧值的闪亮动态单选按钮
- swift - 如何在 swift 中使用 UISegmentedControl 重新加载数据 UITableView
- pyspark - orderBy 如何影响 Pyspark 数据框中的 Window.partitionBy?