首页 > 解决方案 > Minitest - 你如何测试一个方法没有被调用?

问题描述

我正在尝试检查是否未在after_update回调中调用方法。

我目前正在做:

class Foo
  def self.call; end
end

def Model < ActiveRecord::Base
  after_update :do_something

  def do_something
    return unless title_changed?

    Foo.call
  end
end

在测试中它是这样工作的:

test 'Foo.new.bar is invoked' do
  mock = Minitest::mock.new
  mock.expect :call, nil
  Foo.stub(:call) { update_record_to_fire_callback }
  mock.verify 
end

它完美地通过了,但现在我正试图做相反的事情,但没有运气,因为我不知道该怎么做。如果我做assert_not mock.verifyMinitest 无论如何都会抱怨要执行的方法。

或者也许有其他方法来检查方法没有被调用?该方法将执行昂贵的请求,因此,我想避免这种情况。

我正在使用 Rails 5,遗憾的是 Minitest。我愿意添加任何可以与这些版本一起使用的 gem。

标签: ruby-on-railsruby-on-rails-5minitest

解决方案


由于您愿意添加宝石,因此mocha非常适合。添加 gem,然后使用 mocha 的Expectation#never。您的测试可能如下所示:

test 'Foo.new.bar is not invoked' do
  model = Model.new
  Foo.expects(:call).never
  model.update!(not_the_title: 'value') 
end

推荐阅读