如何模拟参数传递给方法+ minitest

时间:2018-06-06 16:31:54

标签: minitest

我正在研究一个测试用例,其中我想检查参数传递给方法的完整性。

这是我的控制器代码的样子。

 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

1 个答案:

答案 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