水豚功能测试ActionView :: Template :: Error

时间:2020-07-13 09:38:56

标签: ruby-on-rails rspec capybara

使用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

你们能看到我错了吗?

2 个答案:

答案 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
相关问题