2012-07-08 2 views
5

필자는 Rails 기술을 향상시키기 위해 Yahoo Answers 애플리케이션을 개발 중입니다. 지금까지 내가 설정 한 두 가지 모델 "질문"과 "답변"그리고 그들은 이런 식으로 중첩 :Rspec 및 Rails보기 테스트 및 중첩 된 리소스

resources :questions do 
    resources :answers 
    end 

내가 컨트롤러, 모델 및 질문 '보기위한 테스트를했습니다,하지만 난 대답의 견해와 중첩 된 길에 약간의 문제가 있습니다. 나는 Rspec 및 공장 소녀를 사용하고 있습니다.

I는 다음의 시험이 있습니다

describe "answers/new.html.erb" do 
    before(:each) do 
    @question = Factory(:valid_question) 
    @answer = Factory(:valid_answer) 
    assign(:question, @question) 
    assign(:answer, stub_model(Answer, 
     :text => "MyString", 
     :question_id => 1 
    ).as_new_record) 
    end 

    it "renders new answer form" do 
    render 
    assert_select "form", :action => question_answers_path(@question), :method => "post" do 
     assert_select "textarea#answer_text", :name => "answer[text]" 
     assert_select "input#answer_question_id", :name => "answer[question_id]" 
    end 
    end 
end 

와 나는 다음과 같은 메시지가 테스트를 실행할 때마다 :

3) answers/new.html.erb renders new answer form 
    Failure/Error: render 
    ActionView::Template::Error: 
     No route matches {:controller=>"answers"} 
    # ./app/views/answers/new.html.erb:6:in `_app_views_answers_new_html_erb__3175854877830910784_6513500' 
    # ./spec/views/answers/new.html.erb_spec.rb:16:in `block (2 levels) in <top (required)>' 

나는

render new_question_answer_path(@question) 
을하고 같은 많은 것들을 시도했습니다

하지만 다음과 같이 표시됩니다.

3) answers/new.html.erb renders new answer form 
    Failure/Error: render new_question_answer_path(@question.id)#, :format=>:html 
    ActionView::MissingTemplate: 
     Missing partial /questions/1/answers/new with {:handlers=>[:erb, :builder, :coffee], :formats=>[:html, :text, :js, :css, :ics, :csv, :xml, :rss, :atom, :yaml, :multipart_form, : 
url_encoded_form, :json], :locale=>[:en, :en]}. Searched in: 
     * "/home/juan/rails_projects/answers/app/views" 
    # ./spec/views/answers/new.html.erb_spec.rb:16:in `block (2 levels) in <top (required)>' 

도와 주시겠습니까? 나는 일종의 우둔 해요.

답변

8

나는이 오류가 여러분의 생각이라고 생각합니다. 그것을 추가 할 수 있습니까?

또한, 여기 RSpec에 사용에 대한 몇 가지 조언입니다 :

  • 당신은하자 블록에 @question@answer 모두를 넣을 수 있습니다. 요즘 선호하는 방법입니다. 문서를 확인하십시오. 사용법은 매우 간단합니다.
  • Factory()이 아니라 실제로 FactoryGirl.create을 사용해야합니다. RSpec 구성에 Factory::Syntax::Methods을 포함하면이 값을 create으로 줄일 수 있습니다.
  • 테스트 더블을 실제 모델과 혼합하는 것은 일반적으로 좋지 않습니다. 모델에서보기를 분리하거나 모든 방법으로 통합해야합니다. 을 Answer.build으로 바꾸거나 @question@answer에 스텁을 사용하십시오. FactoryGirl은 기본적으로 인보기 사양에 대해 Factory.build_stubbed입니다.
  • 사양보기가 우수하지 않습니다. RSpec 메일 링리스트에서 사람들이 왜 그들을 피하기로 선택했는지에 대한 세부 정보를 검색하는 것이 좋습니다. 필자가 생각한 것은 모델과 헬퍼에 대한 의존성 때문에 코드가 변경 될 때 쉽게 깨지기 쉽다는 것이다. 둘 중 하나를 선택하면 모델을 통합하거나 간단한 발표자를 작성할 수 있습니다. 그것은 말하자면, 그들은 그들의 용도가 있지만 희귀합니다. 더 나은 대안은 오이, 스테이크 또는 rspec 및 capybara를 사용하여 통합에서이 상호 작용을 테스트하는 것입니다.
  • 어설 션은 일반적으로보기 스펙에서 테스트하지 않으려는 예제입니다. 폼이 존재한다는 것을 알려주기 때문에 폼 필드를 포함하여 마크 업의 존재를 주장하는 것은 좋은 테스트는 아니지만 작동하는 것은 아닙니다. 통합에서 더 나은 적용 범위를 얻을 수 있습니다. 또한 덜 취약합니다 - 예를 들어 모델이나 필드의 이름을 바꾸면보기 스펙을 변경할 필요가 없습니다.
2

이 문제가 발생했습니다. 스택 추적을 면밀히 살펴보면 뷰가 올바르게 호출되지만 6 행에 오류가 있음을 알 수 있습니다.

필자의 경우이 경우는 레일 경로 도움말 중 하나 인 answers_path(@question)과 같은 호출로 인해 발생했지만이 경우에는 0이 전달되었습니다.

해결 방법은 해당 인스턴스 변수에 assign 호출을 추가하는 것입니다. 로컬 변수가 대신 사용되면 을 호출 할 때 :locals 해시를 통해 전달 될 수 있습니다.