使用Rspec和Capybara进行功能测试。不幸的是,我遇到了问题...
basic_interaction_spec.rb
RSpec.describe "basic interaction" do
before :each do
category = build_stubbed(:category, name: "Pants")
end
it "displays category" do
visit("/")
click_link("Pants")
expect(current_path).to eq("pants")
expect(page).to have_title("Pants | app_name")
end
end
结果
Failure/Error: <li><%= link_to category.name, products_path(category_or_product: category.slug) %></li>
ActionView::Template::Error:
undefined method `name' for nil:NilClass
homepage_controller.rb
def index
@categories = []
Category.root_order.each do |category_name|
@categories << Category.find_by(name: category_name)
end
你们能看到我错了吗?
答案 0 :(得分:0)
在编写功能规格时,您不能使用build_stubbed
来记录您希望应用程序能够访问的记录。假设您正在category
块中构建的before
是您期望应用程序显示在页面上的内容,则您需要实际创建记录,因为该应用程序正在通过数据库查询访问它
before :each do
category = create(:category, name: "Pants")
end
除此之外,永远不要对Capybara对象使用基本的RSpec匹配器(eq
等),而应该使用Capybara提供的匹配器,该匹配器通过提供以下内容来处理使用浏览器的测试的异步性质:等待/重试行为。所以代替
expect(current_path).to eq("pants")
你应该有类似的东西
expect(page).to have_current_path("pants")
答案 1 :(得分:0)
找出问题发生的原因。
忘记类别模型中的方法,该方法可确保仅在首页上显示顶级类别。
def self.root_order
%w[Tops Outerwear Pants Suits Shoes]
end
当并非所有顶级类别都创建时,这引起了一个问题。借助以下夹具,测试通过。
before :each do
category1 = create(:category, name: "Tops")
category2 = create(:category, name: "Outerwear")
category3 = create(:category, name: "Pants")
category4 = create(:category, name: "Suits")
category5 = create(:category, name: "Shoes")
end