Rails 3.1, RSpec — сбой, но страница загружается нормально

#ruby-on-rails #ruby-on-rails-3 #rspec

#ruby-on-rails #ruby-on-rails-3 #rspec

Вопрос:

Я пишу некоторые спецификации, и следующее не выполняется, но страница / menus / 1 нормально загружается в браузере. Это порт php-приложения, и я впервые использую RSpec. Любые мысли о том, почему это может не работать.

Ошибка:

 1) MenusController GET 'show' should be succesful
  Failure/Error: get :show, :id => 1
  ActiveRecord::RecordNotFound:
  Couldn't find MenuHeader with id=1
  # ./app/controllers/menus_controller.rb:18:in `show'
  # ./spec/controllers/menus_controller_spec.rb:7:in `block (3 levels) in <top (required)>'
  

но этот конкретный MenuHeader существует на основе всех обычных критериев (консоль, mysql, браузер). Я на 99% уверен, что в моей спецификации ошибка:

 require 'spec_helper'

describe MenusController do
  describe "GET 'show'" do
     it "should be succesful" do
       get :show, :id => 1
       response.should be_success
     end
  end
end
  

вот menus_controller.rb

 def show
  @menu_header_data=MenuHeader.find(params[:id])


  respond_to do |format|
    format.html # show.html.erb
    # format.json { render json: @menu } to do
  end
end
  

спасибо

Комментарии:

1. Кроме того: у вас есть тест на «получение шоу с несуществующим идентификатором должно завершиться неудачей»?

2. Вы используете это для тестовой базы данных? Вы используете приспособления или фабрики?

3. запуск с тестовой базой данных с данными в ней

4. можете ли вы опубликовать код для app/controllers/menus_controller.rb:18

5. rake db:test:prepare и подтвердите, что данные действительно есть с консоли в тестовой среде.

Ответ №1:

При тестировании контроллера с помощью Rspec или TestUnit я бы использовал фабрику или приспособление для передачи идентификатора, а не для настройки тестовой базы данных с данными. Лучше протестировать что-то вроде:

Использование FactoryGirl (моя рекомендация, но у каждого свои вкусы):

 describe MenusController do
  describe "GET 'show'" do
     it "should be succesful" do
       get :show, :id => Factory(:menu).id
       response.should be_success
     end
  end
end
  

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

Комментарии:

1. Factory.define :menu do |menu| menu.name "My Menu Name" menu.id 1 end