#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