我想测试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]左右......
答案 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