Minitest-如何测试未调用方法?

问题描述 投票:0回答:2

我正在尝试检查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.verify无论如何,Minitest都会抱怨要执行该方法。

或者也许还有其他方法可以检查方法是否未调用?该方法将执行昂贵的请求,因此,我想避免这种情况。

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

ruby-on-rails ruby-on-rails-5 minitest
2个回答
0
投票

最简单的方法是对要确保不会被调用的方法进行存根,并引发错误。

class ModelTest < ActiveSupport::TestCase
  test "does not call Foo.call when title is not changed" do
    model = Model.new
    refute model.title_changed?

    Foo.stub(:call, -> { raise "Foo was called!" }) do
      model.title = "something new"
    end

    assert model.title_changed?
  end
end

没有断言可以检查未明确引发错误。 Rails确实具有assert_nothing_raised,但具有Minitest assert_nothing_raised。您可以根据需要添加它。

does not

0
投票

由于您愿意添加宝石,因此class ModelTest < ActiveSupport::TestCase test "does not call Foo.call when title is not changed" do model = Model.new refute model.title_changed? Foo.stub(:call, -> { raise "Foo was called!" }) do assert_nothing_raised do model.title = "something new" end end assert model.title_changed? end end 效果很好。添加宝石,然后使用摩卡咖啡的mocha。您的测试可以如下所示:

Expectation#never
© www.soinside.com 2019 - 2024. All rights reserved.