代码之家  ›  专栏  ›  技术社区  ›  Tintin81

Rspec在测试XML或CSV输出时神秘地通过

  •  0
  • Tintin81  · 技术社区  · 7 年前

    在我的Rails 5应用程序中,我有:

    class InvoicesController < ApplicationController
    
      def index
        @invoices = current_account.invoices
        respond_to do |format|
          format.csv do
            invoices_file(:csv)
          end
          format.xml do
            invoices_file(:xml)
          end
        end
      end
    
    private
    
      def invoices_file(type)
        headers['Content-Disposition'] = "inline; filename=\"invoices.#{type.to_s}\""
      end
    
    end
    

    describe InvoicesController, :type => :controller do
    
      it "renders a csv attachment" do
        get :index, :params => {:format => :csv}
        expect(response.headers["Content-Type"]).to eq("text/csv; charset=utf-8")
        expect(response).to have_http_status(200)
        expect(response).to render_template :index
      end
    
    end
    

    通行证 (!)即使我把一堆垃圾放进我的 index.csv.erb

    这怎么可能?我错过了什么?

    2 回复  |  直到 7 年前
        1
  •  1
  •   max Mike Williams    7 年前

    控制器测试/规格是这些奇怪的存根创造出来的想法单元测试控制器隔离。这个想法被证明是有缺陷的,最近真的不流行了。

    控制器规范实际上并不向通过路由的应用程序发出真正的HTTP请求。相反,他们只是假装并通过一个假请求。

    可以使RSpec使用 render_views .

    describe InvoicesController, :type => :controller do
      render_views
      it "renders a csv attachment" do
        get :index, format: :csv
        expect(response.headers["Content-Type"]).to eq("text/csv; charset=utf-8")
        expect(response).to have_http_status(200)
        expect(response).to render_template :index
      end
    end
    

    request spec .

    Rails团队和RSpec核心团队的官方推荐 单个控制器动作,但与控制器测试不同的是 这为您正在编写的测试添加了真实性,并有助于避免 控制器规范中常见的许多问题。 http://rspec.info/blog/2016/07/rspec-3-5-has-been-released/

    # spec/requests/invoices
    require 'rails_helper'
    require 'csv'
    RSpec.describe "Invoices", type: :request do
      let(:csv) { response.body.parse_csv }
      # Group by the route
      describe "GET /invoices" do
        it "renders a csv attachment" do
          get invoices_path, format: :csv
          expect(response.headers["Content-Type"]).to eq("text/csv; charset=utf-8")
          expect(response).to have_http_status(200)
          expect(csv).to eq ["foo", "bar"] # just an example
        end
      end
    end
    
        2
  •  1
  •   Matthieu Libeer    7 年前
    1. get :index, params: {}, format: :csv} .

    2. 关于RSpec评估视图,不,在控制器测试中,不管格式如何,它都不会。但是,可以使用RSpec测试视图: https://relishapp.com/rspec/rspec-rails/v/2-0/docs/view-specs/view-spec

    推荐文章