Rspe c ожидаем, что указанный c экземпляр получит - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть модель 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?

...