Как правильно написать тест Minitest для метода, который дает? - PullRequest
0 голосов
/ 09 октября 2018

У меня есть метод в классе, определенный следующим образом:

  def show_benefits_section?
    yield if has_any_context?
  end

Я хотел бы написать тест вокруг этого, пока у меня есть это (который работает):

  test_class.stub(:has_any_context?, true) do
    test_class.show_benefits_section? do |show_section=true|
      assert_equal(show_section, true)
    end
  end

Я просто не уверен, что это лучший способ проверить этот метод ... И как мне проверить отрицательное условие?

Любая помощь будет признательна!

1 Ответ

0 голосов
/ 10 октября 2018

Во-первых, ваш код ничего не тестирует, и он всегда успешен, несмотря ни на что.Попробуйте это, но это удастся, чтобы продемонстрировать смысл:

[1].each do |first=nil, second=2|
  assert_equal(1, first)
  assert_equal(2, second)
end

Позвольте мне объяснить;переменная second всегда равна 2, независимо от того, как метод each не влияет на нее, и значение по умолчанию установлено равным 2. В отличие от этого, значение по умолчанию nil для first игнорируется, потому что each передает объект.

Вот улучшенный фрагмент кода для проверки вашего случая.Он проверяет оба случая, когда блок возвращает true и false, и оба случая, когда has_any_context? - true и false.Я не думаю, что есть общий способ проверить конкретно полученное значение из блока.Вместо этого вы проверяете, что возвращают методы.

# Test: :has_any_context? == true 
test_class.stub(:has_any_context?, true) do
  # Test: a block must be given.
  assert_raises(LocalJumpError) { test_class.show_benefits_section? }

  # Test: yield
  [true, false, 5].each do |tobe|
    # If 5 is given, 5 is returned.
    ret = test_class.show_benefits_section? do
      tobe
    end
    assert_equal(tobe, ret)
  end
end

# Test: :has_any_context? == false
test_class.stub(:has_any_context?, false) do
  ret = test_class.show_benefits_section?{true}
  assert_nil(ret)
end

Обратите внимание, что ваш метод show_benefits_section? возвращает все, что возвращено из блока.Мой пример выше также проверяет это, давая случайное значение, 5. В соглашении Руби, имя метода, заканчивающееся на «?»должен возвращать либо истину, либо ложь (хотя есть исключения вроде FileTest.size?).Если вы хотите следовать соглашению, возможно, самый простой способ - переписать соответствующую часть следующим образом:

!!yield if has_any_context?

. Вы можете подтвердить, что приведенный выше тест не пройден, как только вы выполните эту модификацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...