- Правильно ли настроен мой тест, поэтому я должен также проверять записи, которые не должны быть возвращены запросом?
Да, просто вы должны.
Есть ли способ вызвать создание записей только один раз?
Да, вам нужно, чтобы эти записи были созданы для проверки определенной области.Таким образом, они должны быть вызваны только для этого конкретного теста.Вы можете переместить их в блок describe
, относящийся к области проверки, и тогда они не будут вызваны для других тестов.
# Keep this one without `!`, so it will be called (in other tests), if and when needed
let(:account1) { create(:account, :year) }
describe ".seen_last_two_months" do
let!(:account1) { create(:account, :year) }
let!(:account2) { create(:account, :three_months) }
let!(:account3) { create(:account, :month) }
let!(:account4) { create(:account, :day) }
subject { Account.seen_last_two_months.to_a }
it { is_expected.to eq([account3, account4]) }
end
Обновление
Если выЕсли вы хотите создать записи только один раз для всех тестов, используйте before(:all)
.Похоже, вызов let
определенных переменных внутри блока before(:all)
- плохая идея, вместо этого используйте переменные экземпляра:
before(:all) do
@account1 = create(:account, :year)
@account2 = create(:account, :three_months)
@account3 = create(:account, :month)
@account4 = create(:account, :day)
end
describe ".seen_last_two_months" do
subject { Account.seen_last_two_months.to_a }
it { is_expected.to eq([@account3, @account4]) }
end
Замените все вхождения account*
на @account*
в ваших тестах.
Помните, что изменения, сделанные любым тестом в объекте, также будут отражены в следующих тестах.