如何测试仅适用于生产的模型回调?

时间:2019-02-10 15:33:01

标签: ruby-on-rails rspec

我故意使回调仅对生产有效:

| musicID | instrumentation | solo_instrument |
| ------- | --------------- | --------------- |
| 1       | Brass Band      | Trumpet         |
| 2       | Concert Band    | Clarinet        |

现在,我想在RSpec中创建一个测试。有没有办法更改此特定测试的环境?以下显然现在不起作用:(

after_create :send_slack_notification unless Rails.env.test?

def send_slack_notification
  SlackNotifier.send('test')
end

添加了SlackNotifier类

it "sends a slack notification after registration" do
  notifier = double(SlackNotifier)
  expect(notifier).to receive(:send)
  user_create
end

2 个答案:

答案 0 :(得分:2)

很简单,不是吗?

it "sends a slack notification after registration" do
  allow(Rails.env).to receive(:test?).and_return(false)
  notifier = double(SlackNotifier)
  expect(notifier).to receive(:send)
  user_create
end

更新:您应该修复模型的条件

after_create :send_slack_notification, unless: Proc.new { Rails.env.test? }

def send_slack_notification
  SlackNotifier.send('test')
end

答案 1 :(得分:1)

我认为与其检查您的Rails环境,还可以更轻松地使用环境变量测试此行为。您可以将环境变量设置为Slack webhook的URL,然后检查该变量是否存在,以确定是否尝试发送。如果未定义,则没有操作。

thoughtbot有一个不错的选择,可以临时更改名为climate_control的特定测试的环境变量,从而使这些测试的设置更加容易。