Почему мой функциональный тест не проходит? - PullRequest
1 голос
/ 05 февраля 2012

Извиняюсь заранее, я довольно новичок в рельсах.Создавая сайт для демонстрации кулинарных рецептов, у меня есть функциональный тест для моей домашней страницы и моей страницы рецептов, и оба они терпят неудачу.С досадой они проходили, потом я что-то делал, а теперь они терпят неудачу.Похоже, что тесты не могут как-то загрузить приборы.

Сосредоточившись исключительно на тесте «должен получить шоу» из ресурса рецепта, тест, который не пройден, находится здесь;

class RecipesControllerTest < ActionController::TestCase
  setup do 
    @recipe = recipes(:spag_bol)
  end

  test "should get show" do
    get :show, :id => @recipe.to_param

    assert_not_nil assigns(:recipe)
    assert_equal @recipe.name, assigns(:page_title)
    assert_tag :h1, :content => assigns(:page_title)
    assert_tag :p, :content => @recipe.excerpt

    assert_tag :h2, :content => "Ingredients"
    assert_select "#ingredients li", @recipe.ingredients.lines.count

    assert_tag :h2, :content => "Method"
    assert_select "#method li", @recipe.method.lines.count

    assert_template :show
    assert_response :success
  end
end

приспособление для этого теста здесь;

spag_bol:
  id: 1
  name: "Spaghetti Bolognaise"
  excerpt: "Test test test."
  serves: "2"
  preparation_time: "30 minutes"
  cooking_time: "1 hour"
  method: "Test test test\ntest test test."
  ingredients: "Test test test\ntest test test."

Ошибка на самом деле не является ошибкой, это ошибка;

RecipesControllerTest:
    ERROR should get show (0.02s) 
          ActionView::Template::Error: undefined method `name' for nil:NilClass
          /Users/Laura/.rvm/gems/ruby-1.9.2-p290/gems/activesupport-3.1.3/lib/active_support/whiny_nil.rb:48:in `method_missing'

Очень похоже, что тест не загружает прибор - может кто-нибудь объяснить мне, почему?

РЕДАКТИРОВАТЬ (ОБЪЯСНЕНИЕ РЕШЕНИЯ)

Вместо реального кода, я имел обыкновение просто иметь ссылки на мое git-репо выше.Как указывает Райан ниже, если я сделаю ссылку на основную ветку, то через несколько недель кому-то будет нехорошо, если они найдут этот вопрос, поэтому ссылки исчезнут и будут заменены кодом.По иронии судьбы, это показывает, где я ошибался!Я был убежден, что проблема была вызвана следующей строкой в ​​тесте:

assert_equal @recipe.name, assigns(:page_title)

Поскольку это единственная ссылка, которая ссылается на метод "name", а сообщение об ошибке очень сильно напоминает егоприспособление не возвращало рецепт.На самом деле, так и было, и моя индексная страница фактически выдавала РЕАЛЬНУЮ ошибку, потому что у КАТЕГОРИИ не было имени.Этого не произошло, когда я фактически запустил приложение, потому что моя среда разработки заполнила все эти данные, что еще раз убедило меня, что проблема была в тестах, а не в коде.

Итак, урок усвоен: еслине похоже, что есть проблема с вашими функциональными тестами, тогда ошибка может быть вызвана вашими контроллерами или представлениями по какой-то другой причине, не связанной с тем, что вы пытаетесь протестировать.

Ответы [ 2 ]

2 голосов
/ 05 февраля 2012

Проблема в том, что ваш рецепт не настраивает какие-либо категории.Когда он пытается отобразить app/views/recipes/show.html.erb, он вызывает метод comma_separated_links_for, который предполагает заполнение @recipe.categories.

Внутри этого метода он вызывает pop для него, который получает последний элемент в этом массиве,Поскольку категорий нет, возвращается nil.

Позже, около строки 10 этого метода, вы пытаетесь вызвать name для nil, что приводит к сбою теста.

Чтобы исправить это, назначьте категорию для рецепта прибора.Я очень и очень долго не пользовался приборами, поэтому не могу посоветовать, как это сделать.Вместо этого я использую такие вещи, как factory_girl .

1 голос
/ 05 февраля 2012

Ваш тест работает нормально. Код вашего приложения терпит неудачу, потому что он пытается вызвать метод на ноль. Это обычно происходит с ошибками логики контроллера или опечатками шаблона. В вашем случае вы предполагаете, что вы найдете правильную запись в первой строке recipes#show, поэтому вы продолжаете и вызываете вторую строку, но вы не передаете действительный идентификатор в тесте.

tl; dr: я думаю это:

test "should get show" do
  get :show, :id => @recipe.to_param

должно быть так:

test "should get show" do
  get :show, :id => @recipe.id

Но я думаю, что тест говорит вам, что может быть более серьезная проблема, требующая решения ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...