Ответ 1
rake db:test:prepare
, казалось, устранил проблему.
Не знаю, почему. Схема не была изменена.
Моя спецификация контроллера не работает, потому что Factory Девушка, похоже, создает неидентичные пользователи, даже если я упорядочиваю атрибуты User, которые должны быть уникальными.
Ошибки
1) TopicsController POST #create when topic is invalid should render new
Failure/Error: let(:invalid_topic) {Factory.build :invalid_topic}
ActiveRecord::RecordInvalid:Validation failed: Email has already been taken, Username has already been taken
2) TopicsController POST #create when topic is valid should redirect to show
Failure/Error: let(:valid_topic) {Factory.build :topic}
ActiveRecord::RecordInvalid:
Validation failed: Email has already been taken, Username has already been taken
Спецификация контроллера (RSpec)
describe "POST #create" do
let(:valid_topic) {Factory.build :topic}
let(:invalid_topic) {Factory.build :invalid_topic}
context "when topic is invalid" do
it "should render new" do
post :create, :topic => invalid_topic
response.should render_template(:new)
end
end
context "when topic is valid" do
it "should redirect to show" do
post :create, :topic => valid_topic
response.should redirect_to(topic_path(assigns(:topic)))
end
end
end
Заводы
Factory.define :user do |f|
f.sequence(:username) { |n| "foo#{n}"}
f.password "password"
f.password_confirmation { |u| u.password}
f.sequence(:email) { |n| "foo#{n}@example.com"}
end
Factory.define :topic do |f|
f.name "test topic"
f.association :creator, :factory => :user
f.forum_id 1
end
Почему не Factory Девушка упорядочивает атрибуты пользователя, когда я использую Factory.create :topic
?
rake db:test:prepare
, казалось, устранил проблему.
Не знаю, почему. Схема не была изменена.
Пожалуйста, подумайте об использовании database_cleaner gem. Один из них был разработан специально для того, чтобы выполнить задачу очистки базы данных между тестовыми прогонами.
Этот пост объясняет почти все.
Вы должны рассмотреть возможность удаления всех тем вручную в конце теста. Конечно, это не решение номер один, но разработанный для меня отличный.
after(:all) { Topic.delete_all }