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 

カバレッジgemを使用してLOCカバレッジを確認すると、テストが終了する前に最初の2つのifステートメントに入ることがわかります。

このファイルを関数の残りの部分で読み取れるように渡す方法について、誰かがヒントを得ました。

乾杯

4

1 に答える 1

2

私見、CSVの構成または解析のテストは、現在のテストには属していません。最終的に、このようなテストで実行されるのは、CSV モジュールまたは CSV ファイルの有効性のいずれかをテストすることだけです。これは脆弱なテストであり、アプリケーションについてほとんど何もわかりません。

より良いテスト方法は、モデルのテストを実行して次のことを確認することです。

  1. 適切にフォーマットされた CSV が期待どおりにインポートされます。
  2. 不正な形式の CSV ファイルは、アプリケーションに合わせて適切に処理されます。

コントローラーは、CSV 解析をスタブまたはモックする必要があります。これは、応答コード テストには関係なく、とにかくロジックが実際にはモデルに属しているためです。YMMV。

于 2012-06-14T15:47:52.097 に答える