首页 > 解决方案 > Rspec 期望接收特定的记录实例

问题描述

我有一个User带有属性的 Rails 模型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会调用alert_user26 岁的用户,而不是 19 岁的用户?

标签: ruby-on-railsrspec

解决方案


推荐阅读