Единичное тестирование Определения Mock/Stub в Moq
Любое чтение или советы, которые мне даны на модульном тестировании, всегда предлагали отличную разницу между определением макета и заглушки. Мое настоящее понимание этих определений выглядит следующим образом
Mock: подделка, которая будет использоваться в ваш тест, чтобы сделать окончательное утверждение
Шкура: подделка, которая будет использоваться в ваш тест, чтобы изолировать зависимость, но не утверждаться
Однако Moq, по-видимому, разрешает создание Mocks. Пространство имен Stub в структуре, по-видимому, обесценивается с рекомендациями по использованию Mock.SetupXXX.
Мне что-то не хватает в моем понимании этого? Или существует общее понимание того, что макет объекта может быть использован как не что иное, как заглушка?
Возможно, я педантичен, просто потому, что я всегда считал, что язык в программировании очень строг, и предпочитаю, чтобы мое использование было правильным, особенно когда другие разработчики могли взять на себя проект.
Ответы
Ответ 1
В соответствии с сайт проекта Moq, Moq предоставляет:
Гранулированный контроль над ложным поведением с простой MockBehavior перечислением (нет необходимости изучать, что теоретическое различие между макетом, заглушкой, подделка, динамический макет и т.д.)
Отсутствие различия между mocks, stubs и т.д. - это продуманное дизайнерское решение; Конструктивное решение, которое я, например, предпочитаю. Если мне нужен настоящий макет, я называю Verify()
на него. Если нет, то нет Verify()
. Мне нравится простота, и я не обнаружил недостатка в различии между mock
и stub
.
Ответ 2
Мартин Фаулер написал хорошую статью, Mocks Are not Stubs, что, по-моему, делает различие понятным.
Mocks используются для проверки поведения, в то время как заглушки предоставляют поддельные данные и обычно участвуют в проверке состояния.
Ответ 3
imho его просто, что это своего рода глупая дискуссия.
Важно то, что вы используете макеты/заглушки, чтобы утверждать, что вам нужно в тесте, и не утверждайте, что не делаете.
Ответ 4
Действительно, Moq может создавать настоящие заглушки. На странице Быстрый старт:
* Setup a property so that it will automatically start tracking its value (also known as Stub):
// start "tracking" sets/gets to this property
mock.SetupProperty(f => f.Name);
// alternatively, provide a default value for the stubbed property
mock.SetupProperty(f => f.Name, "foo");
// Now you can do:
IFoo foo = mock.Object;
// Initial value was stored
Assert.Equal("foo", foo.Name);
// New value set which changes the initial value
foo.Name = "bar";
Assert.Equal("bar", foo.Name);
* Stub all properties on a mock (not available on Silverlight):
mock.SetupAllProperties();
ИМХО, различия между вкусами подделок лучше всего рассматривать как различие между функциями этих подделок, а не типов подделок, поскольку подделка может принимать сразу несколько ролей (например, может быть истинным макетом и саботажником все сразу), и поскольку такое различие не требуется для использования макетной структуры. (Я должен блог об этом!)