Иногда настройки Moq очень трудно читать, часто до такой степени, что кому-то еще трудно сказать, что тестируется. В этих сценариях мы часто можем «насмехаться», используя двойной тест, то есть класс, который реализует интерфейс.
Вот пример. Я не могу сказать наверняка, если это делает то, что вы пытаетесь сделать с вашей насмешкой, но это действительно главное. Нелегко прочитать эту настройку и рассказать, что она делает. С другой стороны, действительно легко сказать, что это делает:
public class ObjectWhereIdReturnsPropAHashCode : IMyObject
{
public int Id
{
get => PropA?.GetHashCode() ?? 0;
set => Id = value;
}
public string PropA { get; set; }
}
... и было гораздо проще создать Mock<IObject>
, который делает то же самое.
Когда вы создаете экземпляр двойного теста, имя класса может четко указывать, что этот двойной тест делает для целей данного конкретного теста. (Чтобы быть справедливым, вы также можете сделать это с Moq, сделав хорошо названную функцию, которая создает и возвращает макет.)
Это также более простой шаблон для следующего разработчика, который должен либо создать новый двойной тест, либо изменить существующий.
Я не предлагаю, чтобы мы не использовали Moq - я использую его все время - просто чтобы мы смотрели на альтернативы всякий раз, когда он начинает становиться излишне сложным.