Moq тестирование, если method1 вызывает второй метод2 в том же классе - PullRequest
0 голосов
/ 01 июня 2018

Я новичок в Moq

Я много читал о Moq тестировании и о том, что вы не должны тестировать свой фиктивный объект, вместо этого вы должны использовать Moq, чтобы заглушить зависимости и заставить его действовать как выхочу.Но теперь я спрашиваю себя, как вы можете проверить, вызывается ли метод из другого метода в том же классе, как этот код:

public class A // --> class i want to test
{
  public virtual void TestMethod() // --> does it call testmethod2
  {
    TestMethod2();
  }

  public virtual void TestMethod2()
  {
    // Do something
  }
}

Я думал, что смогу написать Unittest следующим образом:

[TestMethod]
public void MyTestMethod()
{
  Mock<A> aMock = new Mock<A>();
  aMock.Verify(o => o.TestMethod2(), Times.Once);

  aMock.TestMethod();

  aMock.VerifyAll();
}

Но так ли это?Спасибо за все хорошие ответы!

1 Ответ

0 голосов
/ 01 июня 2018

Moq может только макетировать методы, которые являются виртуальными (или предоставлять имитационные реализации для интерфейсов).Если вы попробуете Setup или Verify для не виртуального члена, вы получите ошибку

Недопустимая проверка для не виртуального члена: m => m.TestMethod2 ()

В вашем случае вам потребуется изменить TestMethod2 на виртуальный, то есть

public virtual void TestMethod2()

, который затем можно протестировать:

var aMock = new Mock<A>();

aMock.Object.TestMethod();

aMock.Verify(m => m.TestMethod2(), Times.Once);

КакВы предложили проверить, вызывает ли класс внутренние методы для себя, это запах, указывающий на то, что вы либо

  • проверяете детали внутренней реализации (например, если TestMethod2() был закрытым, это не нашдаже не знать об этом).
  • Или указание на то, что тестируемый класс / система нуждается в рефакторинге на несколько классов, которые должны быть слабо связаны, и, следовательно, могут быть изолированными и лучше тестируемыми.

Примечание

  • Вы не можете Verify вызвать вызов, прежде чем вызовете метод на проверяемой системе, который вы хотите проверить, т.е.переместите Verify после вызова .TestMethod(), как я сделал.
  • Хотя вы можете изменитьваш код для использования Setup + VerifyAll подхода к тестированию, то есть обеспечения того, что все, что вы настроили, действительно вызывается:

aMock.Setup(m => m.TestMethod2());

aMock.Object.TestMethod();

aMock.VerifyAll();

Однако есть спорвокруг того, нарушает ли использование VerifyAll принцип AAA (поскольку вы также фактически указываете критерии Verify в элементе Arrange), и я также обнаружил, что этот подход делает невозможным рефакторинг иСУХОЙ макет настроек в крупномасштабных тестах, и вы также потеряете некоторые из более точного уровня проверки (например, Times.Once).

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