首页 > 解决方案 > 使用 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 消息。我尝试将它们放在VCRdo 块中和块外,但我无法通过测试。他们似乎不见了。我究竟做错了什么?此外,我的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

标签: ruby-on-railsrubyunit-testing

解决方案


这不是这个问题的直接答案,但总体上可能会有所帮助。我不鼓励您直接从控制器调用外部服务。很乱。很难测试。重复使用是不可能的。

将 cdnify 集成包装在一个单独的类中。您将能够使用 VCR 测试该课程。在控制器规范中,您将对其进行模拟并轻松测试闪存。


推荐阅读