我正在研究一个测试用例,其中我想检查参数传递给方法的完整性。
这是我的控制器代码的样子。
def show
response = begin
site = Site.find_by(id: params[:id])
site.bonsai_site_configuration
rescue StandardError => exception
ExceptionNotifier.notify_exception(exception)
{}
end
render json: response, status: 200
end
现在,我想要确保当我模拟find_by
并返回site
对象时,我需要将参数与我想要的完全匹配。
在这里{id: site.id}
这就是我目前的测试方式。我对minitest不是很熟悉,所以请你耐心等待我。因为我不完全确定下面的代码(测试)是否是编写最小测试的正确方法。
test 'Services::SiteController: Show: Return `{}` as Site configuration on error' do
mock = MiniTest::Mock.new
mock.expect :call, true, [RuntimeError]
site = Site.first
site_mock = MiniTest::Mock.new
site_mock.expect :call, site, [{id: site.id}]
raises_exception = Proc.new { raise 'boom' }
Site.stub(:find_by, site_mock) do
site.stub(:bonsai_site_configuration, raises_exception) do
ExceptionNotifier.stub(:notify_exception, mock) do
get "/switch/sites/#{site.id}",
headers: { Authorization: "Basic b2576d705c208c19fd1601ef58aa0506bd4e2e93c51c19df856483cbbfc7cb67" }
response = JSON.parse(@response.body)
assert_successful_response
assert_empty(response)
end
end
end
assert_mock site_mock
assert_mock mock
end
答案 0 :(得分:0)
好的,有两种方法可以测试它。
首先,我是正确的
site_mock.expect :call, site, [{id: site.id}]
是测试此行为的正确方法,我需要更改的是。
site_mock.expect :call, site, [{id: site.id.to_s}]
另一种测试方法是。
site_mock.expect :call, site do |*args|
args[0][:id] == site.id
end