0

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

任何人都得到了关于如何传递这个文件的任何提示,以便函数的其余部分可以读取它。

干杯

4

1 回答 1

2

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

更好的测试实践是对模型进行测试以确保:

  1. 格式正确的 CSV 将以您期望的方式导入。
  2. 格式错误的 CSV 文件会针对您的应用程序进行适当处理。

控制器应该只是存根或模拟 CSV 解析,因为它与响应代码测试无关,而且逻辑无论如何都属于模型。YMMV。

于 2012-06-14T15:47:52.097 回答