Тест функции Capybara ActionView :: Template :: Error - PullRequest
0 голосов
/ 13 июля 2020

Использование Rspe c и Capybara для тестирования функций. К сожалению, у меня возникают проблемы ...

basic_interaction_spe c .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 голосов
/ 14 июля 2020

Выяснили, почему возникла проблема.

Забыл о методе в модели категорий, который гарантирует, что на домашней странице отображаются только категории верхнего уровня.

  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
0 голосов
/ 13 июля 2020

При написании спецификаций функций вы не можете использовать build_stubbed для записей, к которым ваше приложение должно иметь доступ. Предполагая, что category, который вы создаете в блоке before, - это то, что вы ожидаете от приложения для отображения на странице, вам нужно фактически создать запись, потому что приложение обращается к ней через запрос БД.

before :each do
    category = create(:category, name: "Pants")
end

Кроме того, вы никогда не должны использовать базовые c RSpe c сопоставители (eq, и c) с объектами Capybara, вместо этого вы должны использовать сопоставители, предоставленные Capybara, которые позаботятся о асинхронный характер тестов с использованием браузера, обеспечивающий поведение ожидания / повторной попытки. Поэтому вместо

expect(current_path).to eq("pants")

у вас должно быть что-то вроде

expect(page).to have_current_path("pants")
...