Возврат данных из метода moq void с действием без параметров в тестируемую функцию - PullRequest
3 голосов
/ 06 ноября 2019

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

Мой новый метод void (т.е. InTransaction) принимает Action в качестве параметра, в котором я могу просто передать ему анонимный метод:

myFunction()
{
    MyObject data1 = null;
    MyObject data2 = null;

    UnitOfWork.InTransaction(() => 
    {
         data1 = DoSomething(a,b,c);
         data2 = DoSomething(a,b,c);
         UnitOfWork.Save();
    });

    var isValidData1 = IsValid(data1);
    var isValidData2 = IsValid(data2);
}

Проблема, с которой я сталкиваюсь,что мне все еще нужны data1 и data2, чтобы установить какое-то значение, или моя функция IsValid сработает, так как не принимает ноль (упрощенное объяснение, кстати!).

DoSomething - это закрытый метод, он по-прежнему вызывает другие публичные функции / методы, которые также являются поддельными.

, если я вызываю приведенный выше код

Мой метод DoSomething является частным, но онисовершают вызовы без этого нового метода InTransaction:

myFunction()
{
    MyObject data1 = null;
    MyObject data2 = null;

    data1 = DoSomething(a,b,c);
    data2 = DoSomething(a,b,c);
    UnitOfWork.Save();

    var isValidData1 = IsValid(data1);
    var isValidData2 = IsValid(data2);
}

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

Так что я могу использовать мою новую InTransactionas:

unitOfWork.Setup(uow => uow.InTransaction(It.IsAny<Action>());

будет работать правильно, но проблема в том, что остальная часть функции MyFunction завершится ошибкой, так как IsValid ожидает, что data1 и data2 будут установлены на что-то конкретное.

IЯ посмотрел на Callback, но я не думаю, что он подходит для этого. Я использую его в других модульных тестах, но они используются в функции, а не в методе void, где мне разрешено устанавливать параметры для различных объектов.

Любые идеи, как я могу вернуть данные из метода moq voidкоторый принимает параметр Action внутри тестируемой функции.

Спасибо.

1 Ответ

4 голосов
/ 06 ноября 2019

Необходимо вызвать действие, чтобы код вел себя как ожидалось.

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

unitOfWork
    .Setup(_ => _.InTransaction(It.IsAny<Action>())
    .Callback((Action action) => action()); //invoke the action within the callback

Это позволит запустить

//...

    () => {
         data1 = DoSomething(a,b,c);
         data2 = DoSomething(a,b,c);
         UnitOfWork.Save();
    }

//...

так, как это должно быть при выполнении теста.

...