rspec测试respond_to格式和csv

时间:2016-10-18 03:30:23

标签: ruby-on-rails ruby csv ruby-on-rails-4 rspec

我想测试top_users是否在我的rspec控制器中使用了User.top_users。 我如何访问format.csv?我需要这样的东西:

  it 'format csv’ do
    get :index, format: :csv
    # expect(something)……
  end

后来想测试csv:if文件格式是否正确,无需保存/下载。

controller:

def index
  respond_to do |format|  
    format.csv do
        top_users = User.top_users

        send_data(
           top_users.to_csv,
          filename: “top-users-#{Time.zone.today}.csv"
        )
      end
  end
end


model:

  def self.to_csv
    CSV.generate(headers: true) do |csv|
      csv << [‘one’, ‘two’]

      all.each do |user|
          csv << user.csv_data
      end
    end
  end

csv_data是:[user.name,user.email]左右......

2 个答案:

答案 0 :(得分:9)

与CSV,PDF或其他内容无关,它与您使用格式csv的get请求获得的响应有关。 这是我测试我的csv生成器的方式:

describe "GET/index generate CSV" do
  before :each do
    get :index, format: :csv
  end

  it "generate CSV" do
    expect(response.header['Content-Type']).to include 'text/csv'
    expect(response.body).to include('what you expect the file to have')
  end
end

就是这样。

对于您拥有的每个用户,您可以执行以下操作:

 User.top_users.each do |user|
   expect(response.body).to include(user.name) # or the attr you want to check if it's in the file
 end

您还可以添加'pry'gem,在expect之前放置binding.pry并查看响应以及哪些元素对您有所帮助,以检查方法是否正常运行。

答案 1 :(得分:0)

如果您遇到错误 unknown keyword: :format,请尝试以下操作:

describe "GET/index generate CSV" do    
  it "generate CSV" do
    get :index, params: {format: :csv}
    expect(response.header['Content-Type']).to include 'text/csv'
    expect(response.body).to include('what you expect the file to have')
  end
end