Невозможно инициализировать член ложного класса - PullRequest
0 голосов
/ 15 января 2019

У меня есть интерфейс с членами, что-то вроде этого:

public interface IDataLoader
{
    //other stuff
    // tools for loading the items to be processed from disk or cloud
    CustomCollection ItemsToBeProcessed {get; set;}
}

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

В каждом UT я хочу заполнить ItemsToBeProcessed конкретными жестко закодированными данными. Затем передайте данные в тестируемый модуль (модуль процессора) и сравните выходные данные с конкретными жестко закодированными ожидаемыми данными.

Моя проблема в том, что я не могу инициализировать это ItemsToBeProcessed, и я не понимаю, почему.

Пока это мое UT:

[Test]
public void DataProcessor_TestData1_asExpected()
{
    Mock<IDataLoader> mokedAmplifier = new Mock<IDataLoader>(MockBehavior.Loose);
    MainController.Loader = mokedAmplifier.Object;
    if(MainController.Loader.ItemsToBeProcessed == null)
        MainController.Loader.ItemsToBeProcessed = new CustomCollection();

    // here the MainController.Loader.ItemsToBeProcessed is still null.. why???

    var TestData = LoadTestData("testData1.xml");
    var ExpectedData = LoadExpectedData("ExpectedData1.xml")

    MainConroller.Loader.ItemsToBeProcessed.AddRange(TestData);

    var ProcessingModuleBeingTested = new ProcessingModule();
    var results = ProcessingModuleBeingTested.Process(MainController.Loader.ItemsToBeProcessed);
    Asert.isEqual(ExepctedData, results);
}

Как мне инициализировать этого участника?

Ответы [ 3 ]

0 голосов
/ 15 января 2019

Свойство - это не что иное, как метод get и set. Если вы присваиваете значение для вашего смоделированного экземпляра, вы просто используете setter -метод, который никоим образом не связан с getter-методом . Итак, по ошибке Mock создайте для вас класс, подобный следующему:

class TheMockClass : IDataLoader
{
    CustomCollection get_ItemsToBeProcessed { return whatever; }
    void set_ItemsToBeProcessed {  }
}

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

Вы видите, что, когда насмехаются над этими двумя методами, они не имеют ничего общего. Так что вам придется синхронно издеваться. Однако обычно достаточно смоделировать от getter до возврата вашего значения, так как вы просто используете значение, которое высмеивается, а не set это.

mokedAmplifier.Setup(_ => _.ItemsToBeProcessed).Returns(new CustomCollection());
0 голосов
/ 15 января 2019

Вам необходимо настроить свойство:

    mokedAmplifier.SetupAllProperties();
    MainController.Loader = mokedAmplifier.Object;
    if (MainController.Loader.ItemsToBeProcessed == null)
        MainController.Loader.ItemsToBeProcessed = new CustomCollection();

или

    var coll = new CustomCollection();
    mokedAmplifier.Setup(x => x.ItemsToBeProcessed).Returns(coll);
0 голосов
/ 15 января 2019

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

var collection = new CustomCollection();
var mokedAmplifier = new Mock<IDataLoader>(MockBehavior.Loose);

mokedAmplifier.Setup(_ => _.ItemsToBeProcessed).Returns(collection);

//...

Если вы хотите, чтобы макет запоминал изменения, внесенные в свойство, используйте SetupAllProperties

Указывает, что все свойства на макете должны иметь "свойство поведения", Это означает, что установка его значения приведет к его сохранению и последующему возврату когда собственность запрошена. (это также известно как «заглушка»). По умолчанию значение для каждого свойства будет сгенерировано как указано Свойство Moq.Mock.DefaultValue для макета.

var mokedAmplifier = new Mock<IDataLoader>(MockBehavior.Loose);

mokedAmplifier.SetupAllProperties(); //<--

MainController.Loader = mokedAmplifier.Object;

if(MainController.Loader.ItemsToBeProcessed == null)
    MainController.Loader.ItemsToBeProcessed = new CustomCollection();

//...

Ссылка Moq Quickstart , чтобы получить помощь в понимании структуры насмешек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...