2012-06-14 2 views
0

로컬 디스크에서 csv 파일을 업로드하고 사용자 세부 정보를 내 응용 프로그램에 내 보내려면 users_controller에 다음과 같은 기능이 있습니다. 코드가 응용 프로그램에서 올바르게 작동하지만 테스트에서 csv를 전달하는 방법은 확실하지 않습니다. 내 기능은 다음과 같습니다 :rspec에 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 테스트에서이를 다루려고 시도한 나의 시도입니다. 내가 커버리지 보석으로 LOC 범위를 검사 할 때

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 

나는 문이 전에 종료되면 테스트가 처음 두 들어가는 것을 볼 수 있습니다.

필자는이 파일을 전달하는 방법에 대한 조언을 얻었으므로 나머지 기능에서 읽을 수 있습니다.

건배

답변

2

IMHO, 테스트 CSV 구성이나 분석은 현재 테스트에 속하지 않습니다. 궁극적으로 이러한 모든 테스트는 CSV 모듈 또는 CSV 파일의 유효성을 테스트하는 것입니다.이 테스트는 취약한 테스트이며 응용 프로그램에 대해 거의 알려주지 않습니다.

더 나은 테스트 연습을 보장하기 위하여 모델의 테스트를 수행하는 것입니다 :

  1. 올바른 형식의 CSV는 예상대로 가져옵니다.
  2. 조작 된 CSV 파일은 응용 프로그램에 맞게 처리됩니다.

컨트롤러는 스텁하거나 응답 코드 테스트 관련이없는이기 때문에 CSV 구문 분석을 조롱하고, 논리는 정말 어쨌든 모델에 속하는해야한다. YMMV.