2010-09-08 3 views
12

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

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

Сто: подделка, которая будет использоваться в тесте изолировать a не заявлено

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

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

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

ответ

14

Согласно Moq project site, Moq обеспечивает:

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

Отсутствие различия между mocks, stubs и т. д. является преднамеренным дизайнерским решением; Конструктивное решение, которое я, например, предпочитаю. Если мне нужен настоящий макет, я звоню Verify(). Если нет, то нет Verify(). Мне нравится простота, и я не обнаружил недостатка в различии между mock и stub.

2

imho его просто, что его вид глупой дискуссии.

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

+1

Я не согласен с eglasius.Тесты должны быть чрезвычайно просты в чтении, переваривании и понимании того, что выполняются другими разработчиками. Язык играет ключевую роль в этом. – WDuffy

+0

@WDuffy уверен, но, как я вижу, это уже ясно сказано в коде теста для их достижения. – eglasius

+0

Дифференцирование заглушек из Mocks полезно для указания читателю теста, чтобы узнать, какие сообщения относятся к текущему тесту (ожиданиям) от случайных (заглушек) – Gishu

9

Martin Fowler написал хорошую статью, Mocks Aren't Stubs, что, я думаю, делает различие понятным.

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

+0

, но проверка поведения относится к данным, даже если эти данные по-другому. Уверены, что термины четко определены, но это не значит, что это гарантирует отсутствие гибкости, когда это различие явно размыто. – eglasius

+1

@eglasius Конечно. У меня нет проблем с библиотекой, думающей, что она передает мне то, что она называет макетом, хотя я хочу использовать ее как заглушку. Я просто перечислим переменную для моего использования. –

+0

+1 определенно согласен, если команда чувствует, что важно сообщить различие, присвоение переменной приведет к ее устранению. – eglasius

0

Действительно, Moq может создавать настоящие заглушки. Из Moq Quick Start page:

* 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(); 

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

Смежные вопросы