将CSV文件作为参数传递给rspec

时间:2012-06-14 15:19:06

标签: ruby-on-rails-3 file-upload csv controller rspec2

我的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语句。

任何人都有关于如何传递此文件的任何提示,以便可以由函数的其余部分读取。

干杯

1 个答案:

答案 0 :(得分:2)

恕我直言,测试CSV组合或解析不属于您当前的测试。最终,所有这样的测试都会测试CSV模块或CSV文件的有效性 - 这是一个脆弱的测试,并且很少告诉您应用程序。

更好的测试做法是对模型进行测试,以确保:

  1. 以您期望的方式导入格式正确的CSV。
  2. 格式错误的CSV文件会根据您的应用进行适当处理。
  3. 控制器应该只是存根或模拟CSV解析,因为它与响应代码测试无关,并且逻辑确实属于模型。 YMMV。