AutoMoqer: передача параметров в конструкторы - PullRequest
4 голосов
/ 07 декабря 2011

Когда мне нужно высмеять какой-то класс, который выглядит следующим образом:

public class Dummy
{
  private readonly int _someInt;
  private readonly int _someOtherInt;
  private readonly IFoo _foo;

    public Dummy(int someInt,int someOtherInt, IFoo foo)
    {
      _someInt = someInt;
      _someOtherInt = someOtherInt;
      _foo = foo;
    }
}

Я использую Moq, чтобы сделать что-то вроде этого:

[Test]
public void ShouldCreateADummyInstance()
{
      var someInt = 1;
      var someOtherInt = 2;

      var mockFoo = new Mock<IFoo>();

      var dummy = new Dummy(someInt, someOtherInt, mockFoo.Object);

      //And so on...
}

Но когда я использую AutoMoq Я не могу указать разные значения int для каждой зависимости (я имею в виду someInt и someOtherInt) в своем конструкторе, потому что AutoMoqer.SetInstace (instanceIWantToUse) устанавливает один и тот же указанный экземпляр каждый раз, который должен предоставить эту зависимость.

Знаете ли вы, как я могу указать другое int для someInt и someOtherInt, чтобы продолжать использовать AutoMoqer в моих тестах?

Спасибо, надеюсь, вы поможете мне!

Ответы [ 2 ]

2 голосов
/ 10 декабря 2011

Полное раскрытие: я никогда не использовал AutoMoq (хотя я просто подписался, чтобы подписаться на него на GitHub, так как он выглядит интригующим, и мне нравятся вещи, которые сокращают шаблон).

Тем не менее, выглядитКак инструмент AutoMoq был разработан для другого случая использования, чем у вас.Похоже, что он использует его для «проверки на будущее» против неработающих модульных тестов, если добавлена ​​зависимость, добавленная другим конструктором, и для возможности создания объекта по умолчанию с чем-то там для зависимостей, предположительно, чтобы избежать исключений нулевой ссылки.

После прочтения страницы проекта AutoMoq я бы предположил, что если бы Даррен писал ваш конкретный модульный тест, он, вероятно, просто использовал бы Moq из коробки.То есть для этого конкретного теста , вам, вероятно, следует пройти тест, который вы опубликовали.Похоже, что AutoMoq нацелен на предоставление разумного поведения по умолчанию, когда вы не хотите задавать все свои зависимости в тесте.Но в вашем случае вы do хотите указать эти конкретные зависимости.

То, что вы используете обычный Moq для этого конкретного теста, не означает, что вы не можете использовать AutoMoq для других тестов.Остальные ваши тесты (где оба целых числа равны нулю или что-то в этом роде) будут рассчитаны на будущее, но вам, возможно, придется пережить этот разрыв, если вы добавите другой параметр конструктора в ваш класс Dummy.

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

0 голосов
/ 19 июня 2018

Решение, похожее на Moq

Вы можете создать экземпляр Dummy в AutoMoq, очень похожий на Moq. Это не защищает ваш тестовый код от изменений параметров конструктора в будущем, но все же может быть приемлемым.

var mocker = new AutoMoqer();
var fooMock = mocker.GetMock<IFoo>();
var dummy = new Dummy(1, 2, fooMock.Object);
// test something about dummy

Решение с AutoMoq

Если вы действительно хотите проверить свой TestCode на будущее, то может потребоваться изменить конструктор, чтобы он зависел от интерфейсов.

interface IDummyParameters {
    int SomeInt {get;set;}
    int SomeOtherInt {get;set;}
}

public class Dummy {
    public Dummy(IDummyParameters parameters, IFoo foo){
        ...
    }
}

Затем вы можете создать свой класс Dummy с помощью AutoMoq следующим образом:

var mocker = new AutoMoqer();
mocker.GetMock<IDummyParameters>.Setup(x => x.SomeInt).Returns(1);
mocker.GetMock<IDummyParameters>.Setup(x => x.SomeOtherInt).Returns(2);
// notice how this code does not say anything about IFoo.
// It is created automatically by AutoMoq
var dummy = mocker.Create<Dummy>();
...