Подтвердить что ты не робот

Единичное тестирование Определения Mock/Stub в Moq

Любое чтение или советы, которые мне даны на модульном тестировании, всегда предлагали отличную разницу между определением макета и заглушки. Мое настоящее понимание этих определений выглядит следующим образом

Mock: подделка, которая будет использоваться в ваш тест, чтобы сделать окончательное утверждение

Шкура: подделка, которая будет использоваться в ваш тест, чтобы изолировать зависимость, но не утверждаться

Однако Moq, по-видимому, разрешает создание Mocks. Пространство имен Stub в структуре, по-видимому, обесценивается с рекомендациями по использованию Mock.SetupXXX.

Мне что-то не хватает в моем понимании этого? Или существует общее понимание того, что макет объекта может быть использован как не что иное, как заглушка?

Возможно, я педантичен, просто потому, что я всегда считал, что язык в программировании очень строг, и предпочитаю, чтобы мое использование было правильным, особенно когда другие разработчики могли взять на себя проект.

4b9b3361

Ответ 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();

ИМХО, различия между вкусами подделок лучше всего рассматривать как различие между функциями этих подделок, а не типов подделок, поскольку подделка может принимать сразу несколько ролей (например, может быть истинным макетом и саботажником все сразу), и поскольку такое различие не требуется для использования макетной структуры. (Я должен блог об этом!)