Я немного растерялся из-за того, что RSpec всегда придерживался основанных на xUnit средах тестирования, но я попробую.
Вложенный характер написания спецификаций вызывает у меня некоторые головные боли в отношении того, где я должен выполнять настройку / демонтаж базы данных.
Согласно DatabaseCleaner README:
Spec::Runner.configure do |config|
config.before(:suite) do
DatabaseCleaner.strategy = :transaction
DatabaseCleaner.clean_with(:truncation)
end
config.before(:each) do
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
end
Теперь я не могу использовать транзакции, потому что я использую их в своем коде, поэтому я просто придерживаюсь усечения, но это не должно быть ни здесь, ни там.
У меня есть это:
RSpec.configure do |config|
config.mock_with :rspec
config.before(:suite) do
DatabaseCleaner.strategy = :truncation
end
config.before(:each) do
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
end
Проблема здесь в том, что любые приборы, которые я создаю в блоке subject
или let
, уже исчезли (из базы данных), когда я пытаюсь использовать их в следующем блоке describe
или it
.
Например (используя Machinist для создания приборов ... но это не должно быть актуально):
describe User do
describe "finding with login credentials" do
let(:user) { User.make(:username => "test", :password => "password") }
subject { User.get_by_login_credentials!("test", "password") }
it { should == user }
end
end
Я борюсь с тем, как я должен вкладывать эти describe
и subject
и другие блоки, так что, возможно, это моя проблема, но в основном это не удается, потому что, когда он пытается получить пользователя из базы данных, он уже был удален из-за вызова after(:each)
, предположительно после let
?