【问题标题】:How to stub a method in ActiveSupport::TestCase如何在 ActiveSupport::TestCase 中存根方法
【发布时间】:2016-08-10 07:44:55
【问题描述】:
在RSpec 我可以这样存根方法:
allow(company).to receive(:foo){300}
如何使用ActiveSupport::TestCase 存根方法?
我有一个这样的测试。
class CompanyTest < ActiveSupport::TestCase
test 'foobar' do
company = companies(:base)
#company.stubs(:foo).returns(300)
assert_nil(company.calculate_bar)
end
end
【问题讨论】:
标签:
ruby-on-rails
testcase
【解决方案1】:
Minitest 带有一个开箱即用的stub 方法,以防您不想使用外部工具:
require 'minitest/mock'
class CompanyTest < ActiveSupport::TestCase
test 'foobar' do
company = companies(:base)
Company.stub :foo, 300 do
assert_nil(company.calculate_bar)
end
end
end
【解决方案2】:
Minitest 有一些有限的模拟功能,但我建议对这些类型的存根使用 mocha gem。
Mocha 的语法正是你在注释掉的那一行:
class CompanyTest < ActiveSupport::TestCase
test 'foobar' do
company = companies(:base)
company.stubs(:foo).returns(300)
assert_nil(company.calculate_bar)
end
end
【解决方案3】:
增强@Farrukh 答案:
如果你想验证传递的参数,比如allow(company).to receive(:foo).with(some_args).and_return(300),
您可以使用assert_called_with。
# requiring may not be needed, depending on ActiveSupport version
require "active_support/testing/method_call_assertions.rb"
include ActiveSupport::Testing::MethodCallAssertions # so we can use `assert_called_with`
assert_called_with(company, :foo, some_args, returns: 300) do
assert_nil(company.calculate_bar)
end