Использование AutoFixture с пакетом AutoFixture.AutoMoq, я иногда найти тесты, которые не были настроены правильно проверить вещи они имели в виду, чтобы проверить, но проблема так и не был обнаружен из-за Mock поведение по умолчанию (Свободный):Как сделать AutoMoqCustomization использовать Strict MockBehavior?
public interface IService
{
bool IsSomethingTrue(int id);
}
void Main()
{
var fixture = new Fixture()
.Customize(new AutoMoqCustomization());
var service = fixture.Freeze<Mock<IService>>();
Console.WriteLine(service.Object.IsSomethingTrue(1)); // false
}
Я хочу, чтобы Mocks создавался с использованием Строгого поведения, поэтому мы вынуждены вызывать Setup()
для методов, которые мы ожидаем назвать. Я могу сделать это для каждого отдельного издеваться, как это:
fixture.Customize<Mock<IService>>(c => c.FromFactory(() => new Mock<IService>(MockBehavior.Strict)));
Но после расчесывания через исходный код для AutoMoqCustomization() и различных ISpecimenBuilder
и других реализаций, я довольно потерял, чтобы наилучшим образом, чтобы просто сделать все Mocks инициализируется строгим поведением. Структура представляется очень гибкой и расширяемой, поэтому я уверен, что есть простой способ сделать это - я просто не могу понять, как это сделать.
Спасибо за обратную связь. Я посмотрю, смогу ли я заставить его работать. Что касается строгих издевательств: если издевки были действительно «насмешливыми», я думаю, что ваша точка действительна. К сожалению, большинство моих издевательств действительно служат цели * stubs *, которые, как ожидается, вернут значение. Если SUT полагается на данные, возвращенные из заглушки, и я не настроил заглушку, тогда в лучшем случае тест завершится неудачно, и в худшем случае тест пройдет по неправильной причине. Я бы предпочел в любом случае мгновенно увидеть строку кода, показывающую, какая заглушка нуждается в настройке, вместо того, чтобы выводить, откуда приходит NRE. – StriplingWarrior
@StriplingWarrior http://blog.ploeh.dk/2013/10/23/mocks-for-commands-stubs-for-queries –
Я нахожу, что пример статьи довольно надуманный: нарушение CQS для создания и возврата пользовательского объекта который даже не имеет идентификатора, предоставленного методу GetUser.Это не те изменения, которые я обычно вижу в методах. Изменения, которые я вижу регулярно, в любом случае потребуют изменения в модульном тесте, даже если они написаны как окончательный правильный пример в этой статье. Когда это происходит, я обнаружил, что быстрое и быстрое выполнение Strict mocks экономит много времени и, что еще важнее, помогает гарантировать, что мои модульные тесты проверяют то, что они утверждают, что тестируют. – StriplingWarrior