Minitest - 如何测试未调用的方法?
Minitest - How do you test a method isn't invoked?
我正在尝试检查 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。我愿意添加任何可以与这些版本一起使用的 gem。
完成此操作的最简单方法是对要确保未被调用的方法进行存根,并让它引发错误。
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
, but Minitest does not。喜欢的可以加哦
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
既然您愿意添加 gem,mocha works well for this. Add the gem, then use mocha's Expectation#never。然后你的测试看起来像:
test 'Foo.new.bar is not invoked' do
model = Model.new
Foo.expects(:call).never
model.update!(not_the_title: 'value')
end
我正在尝试检查 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。我愿意添加任何可以与这些版本一起使用的 gem。
完成此操作的最简单方法是对要确保未被调用的方法进行存根,并让它引发错误。
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
, but Minitest does not。喜欢的可以加哦
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
既然您愿意添加 gem,mocha works well for this. Add the gem, then use mocha's Expectation#never。然后你的测试看起来像:
test 'Foo.new.bar is not invoked' do
model = Model.new
Foo.expects(:call).never
model.update!(not_the_title: 'value')
end