2016-11-23 5 views
2

Допустим, у меня есть этот метод, который был высмеивал:Как вернуть реальный объект из издевались объекта с Moq

public Comfirmation AddCustomer(Customer customer) 
{ 
    // add customer to the Database 
    return confirmation; 
} 

а также мой макет выглядит так:

_service 
.Setup(x =>x.AddCustomer(It.IsAny<Customer>)) 
.Returns(new Confirmation()); 

Как может Я получаю подтверждение объекта/состояния от фактического метода? Я знаю, что цель насмешки заключается в том, чтобы изолировать внешние факторы, влияющие на поведение кода, но мне действительно нужно получить вычисленный результат фактического метода. Потому что этот результат будет использован в некоторой другой части теста.

+0

Просьба уточнить вашу конкретную проблему или добавить дополнительные детали, чтобы выделить именно то, что вам нужно. Как это в настоящее время написано, что трудно точно сказать, что вы просите. Смотрите [Как Ask ] (http://stackoverflow.com/help/how-to-ask), чтобы помочь уточнить этот вопрос. – Nkosi

ответ

1

Moq не выполняет функцию класса AddCustomer. Таким образом, нет никакой возможности с вашей текущей настройкой Moq, чтобы получить объект Confirmation, что может быть реализована реальная реализация AddCustomer.

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

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

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

Другим подходом является создание объектов Confirmation, которые могут быть созданы функцией AddCustomer. Это может быть сделано вручную или для более сложных объектов с помощью некоторого подхода захвата/повтора (например, сериализация подходящего объекта Confirmation из функции AddCustomer в XML или JSON и создание объекта Confirmation для макета в другом тесте путем анализа статического XML или JSON строка по десериализатору. Например

string capturedJson = "...."; // <= JSON of a Confirmation object 
var confirmation = JsonConvert.DeserializeObject<Confirmation>(capturedJson); 
_service 
    .Setup(x =>x.AddCustomer(It.IsAny<Customer>)) 
    .Returns(confirmation); 

target.SomeConfirmationObjectUsingFunction(_service); 
+0

Да, это правильно. Сериализация состояния объектов было бы лучшим способом. То, что вы получаете, когда вы пытаетесь выполнить единый тестовый код, который был введен en без понятия модульного тестирования. –

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