ruby-on-rails - 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_user
26 岁的用户,而不是 19 岁的用户?
解决方案
推荐阅读
- python - 在 Tensorflow 2 中训练时改变 BatchNormalization 动量
- firebase - 条码阅读器扫描条码时如何从 Firestore 中检索数据
- firebase - 部署flutter web应用程序时firebase托管错误409
- ubuntu - ubuntu 20.04:突然“p”键和向上/向下键不起作用
- regex - 用于捕获单引号内的数据的良好正则表达式,但前提是它以某些东西为前缀?
- visual-studio-code - “package.hugo.json”的VSCode文件关联?
- excel - 循环以新名称(日期)多次复制工作表
- c# - 将单元格值分配给 GridView 中的 NavigateUrl
- shell - “find | xargs | ls” 不在 find 的文件名上运行 ls
- r - 关于定义因子变量的一些混淆