У меня есть модель Rails User
с атрибутом age
.
Я хочу проверить, что некоторый код предупреждает пользователей старше 25 лет.
У меня есть этот тест, написанный :
it 'sends an alert to users over 25' do
user_who_should_be_alerted = User.create(age: 26)
user_who_should_not_be_alerted = User.create(age: 19)
expect(user_who_should_be_alerted).to receive(:alert_user)
expect(user_who_should_not_be_alerted).not_to receive(:alert_user)
alert_users_over_25
end
Конечно, это не сработает, поскольку alert_users_over_25
создаст новые объекты путем запроса к базе данных. Он не будет использовать те, которые созданы в тесте.
Самое близкое, что я придумал, это:
it 'sends an alert to users over 25' do
user_who_should_be_alerted = User.create(age: 26)
user_who_should_not_be_alerted = User.create(age: 19)
expect_any_instance_of(User).to receive(:alert_user).once
alert_users_over_25
end
Это в основном работает, но я не говорю явно, какой пользователь должен быть предупрежденным, чтобы он мог пройти, если он только уведомит user_who_should_not_be_alerted
.
Мой другой вариант - создать одного пользователя в возрасте 19 лет, затем запустить alert_users_over_25
и ожидать, что никто не будет предупрежден. Затем в другом тесте создайте пользователя в возрасте 26 лет и ожидайте обратного. Опять же, это кажется менее пуленепробиваемым, поскольку я не проверяю, как это работает, когда в базе данных несколько пользователей. Это также кажется менее ясным. Я думаю, что первый тест показывает, что метод должен работать намного лучше, чем другой вариант.
Мой вопрос: каков самый чистый способ реализации этого теста, чтобы alert_users_over_25
вызывал * 1023? * для пользователя, которому 26 лет, но не для пользователя 19?