我的users_controller中有以下函数从本地磁盘上传csv文件,并将其中的用户详细信息导出到我的应用程序中。代码在应用程序中正常工作,但我不确定如何在测试中传递csv。我的功能如下:
def upload
if request.post?
if (params[:user].nil? || params[:user][:csv].blank?)
flash[:notice] = "Please provide a csv file to upload."; return
end
file = params[:user][:csv].read
CSV.parse(file, headers: true, header_converters: :symbol).each { |row| Cortex::User.create(row.to_hash) }
respond_to do |format|
format.html { redirect_to admin_engine.cortex_users_path }
format.json { head :no_content }
end
else
# Provide upload view
end
end
这是我试图在rspec测试中试图解决这个问题。
it "should be a success" do
post "admin/users/upload", :user => @user, :user_csv => fixture_file_upload(Admin::Engine.root.join('spec/dummy/tenants_sample.csv')), :session_token => @auth_token
response.code.should eq("200")
end
当我用coverage gem检查LOC覆盖时,我可以看到测试在退出之前进入前两个if语句。
任何人都有关于如何传递此文件的任何提示,以便可以由函数的其余部分读取。
干杯
答案 0 :(得分:2)
恕我直言,测试CSV组合或解析不属于您当前的测试。最终,所有这样的测试都会测试CSV模块或CSV文件的有效性 - 这是一个脆弱的测试,并且很少告诉您应用程序。
更好的测试做法是对模型进行测试,以确保:
控制器应该只是存根或模拟CSV解析,因为它与响应代码测试无关,并且逻辑确实属于模型。 YMMV。