我在测试属于作者的书籍列表时收到以下错误。
Failure/Error: visit books_path
ActionView::Template::Error:
undefined method `name' for nil:NilClass
# ./app/views/books/_book.html.erb:5:in `_app_views_books__book_html_erb___3197212671375452820_30961180'
# ./app/views/books/index.html.erb:8:in `_app_views_books_index_html_erb__3030997400964951224_38341240'
# ./spec/requests/book_pages_spec.rb:13:in `block (3 levels) in <top (required)>'
我一直试图调试它2天没有成功,我现在转向SO寻求帮助。
我必须指出Book #index正确显示所有书籍,这个bug可能就在我的测试中。我认为工厂女孩没有正确创建关联,因为book.author返回nil。
谢谢!
book.rb
class Book < ActiveRecord::Base
attr_accessible :title
belongs_to :author
validates :author_id, presence: true
end
author.rb
class Author < ActiveRecord::Base
attr_accessible :name
has_many :books, dependent: :destroy
end
factories.rb
FactoryGirl.define do
factory :author do
sequence(:name) { |n| "Author #{n}" }
end
factory :book do
sequence(:title) { |n| "Lorem ipsum #{n}" }
author
end
end
_book.html.erb
<li>
<span class="title"><%= link_to book.title, book_path(book) %></span>
<span class="author"><%= link_to book.author.name, author_path(book.author) %></span>
</li>
book_pages_spec.rb
require 'spec_helper'
describe "Book pages" do
subject { page }
describe "index" do
let(:author) { FactoryGirl.create(:author) }
before(:each) do
visit books_path
end
before(:all) { 32.times {FactoryGirl.create(:book, author: author)} }
after(:all) { Author.delete_all }
it { should have_title_and_heading("All books") }
end
end
答案 0 :(得分:2)
在after(:all)
步骤中,您要清除作者,而不是before(:all)
步骤中创建的图书。由于之前/之后:所有挂钩都在测试中的任何事务之外运行,您可能会在测试数据库中留下过时的数据。