2012-07-08 90 views
5

我正在开发一个应用程序的雅虎应用程序,以提高我的Rails技能。 到目前为止,我已经设置两种模式“问题”和“答案”,他们被嵌套这样:Rspec和Rails查看测试和嵌套资源

resources :questions do 
    resources :answers 
    end 

我的控制器,模型和问题的意见作出的测试,但我对答案的观点和嵌套路线有点麻烦。我正在使用Rspec和Factory女孩。

我有以下测试:

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在let块。这是现在这样做的首选方式。查看文档,使用起来非常简单。
  • 您应该实际使用FactoryGirl.create而不是Factory()。如果在RSpec配置中包含Factory::Syntax::Methods,则可以将其缩短为create
  • 将测试双打与实际模型混合通常不是一个好主意。您应该将视图从模型中分离出来,或将它们整合到一起 - 将stub_model替换为Answer.build,或使用存根@question@answer。 FactoryGirl有Factory.build_stubbed,基本上stub_model适合查看规格。
  • 查看规格已经失去了恩典。我建议在RSpec邮件列表中搜索有关人们选择避开它们的细节。我认为它们相当脆弱(更改代码时很容易中断),因为它们依赖于模型和帮助程序。要么他们强迫你去存根,整合模型,或者写一个简单的主持人。这就是说,他们有他们的用途,但他们很少见。更好的选择是在集成中测试这种相互作用,或者使用黄瓜,牛排或者rspec和水豚。
  • 您的断言是您通常不想在视图规范中测试的示例。你声称存在一些标记,包括表单域,这本身并不是一个好的测试,因为它告诉你表单在那里,但不是它在工作。您将在集成中获得更好的覆盖率。而且,它不会很脆弱 - 例如,如果您重命名模型或字段,则不需要更改视图规范。
2

我遇到了这个问题。如果仔细观察堆栈轨迹,您会看到您的视图正在被正确调用,但第6行出现错误。

在我这种情况下,这是由于调用其中一个导轨路径帮助引起的,例如answers_path(@question),但它已通过nil。

修复方法是为该实例变量添加一个assign调用。如果使用本地变量,那么调用render时可以通过:locals散列传入。