Как смоделировать передачу аргумента в метод + minitest - PullRequest
0 голосов
/ 06 июня 2018

Я работаю над тестовым примером, в котором я хочу проверить целостность аргумента, передаваемого методу.

Вот как выглядит код моего контроллера.

 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}

Так выглядит мой тест.Я не очень хорошо знаком с Минитестом, поэтому прошу вас, пожалуйста, наберитесь терпения.Поскольку я не совсем уверен, является ли приведенный ниже код (тест) правильным способом написания теста минимального теста.

 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 голосов
/ 07 июня 2018

Хорошо, есть 2 способа проверить это.

Во-первых, я был прав:

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
...