Как установить значение параметра out Mocked in Moq в пределах «Return»? - PullRequest
0 голосов
/ 04 июня 2018

У меня возникли проблемы при настройке моего Moq.

У меня есть макет с методом, у которого есть параметр out.Этот выходной параметр действительно используется, и мне нужно заполнить его некоторым значимым значением в зависимости от параметра, который я получаю.

В настоящее время я не могу этого сделать, возможно ли это?Как?

Вот мой текущий статус:

Mock<IMyMock> _mock = new Mock<IMyMock>();
bool someFlag= false;
_mock.Setup(m=>m.GetSomething(It.IsAny<DateTime>(), It.IsAny<DateTime>(), out someFlag))
     .Returns((DateTime start, DateTime end, bool someFlagInternal)=>{
        IEnumerable<SomeOtherClass> otherClasses = GenerateMockedData(start, end);
        //Assign something to someFlag, depending on start and end
        someFlag=true;//This has no effects
     }) ;
new SomeController(_mock.Object);

В моем SomeController, на конкретном методе мой реальный немодальный код вызывает его:

public class SomeController{}
    private IMyMock _someObjectThatWeDontKnowIsAMock;
    public SomeController(IMyMock someObjectThatWeDontKnowIsAMock) {
        _someObjectThatWeDontKnowIsAMock= someObjectThatWeDontKnowIsAMock;
    }

    private void ComputeNext() {
        Tuple<DateTime, DateTime> times = ComputeNextTimes();
        bool hasOverlap;
        IEnumerable<SomeOtherClass> otherClassesInstances = _someObjectThatWeDontKnowIsAMock.GenerateMockedData(times.Data1, times.Data2, out hasOverlap);
        if(hasOverlap) {
            //...
        }
    }
}

Каждый раз, когда я вызываю мой макет, кажется, что он возвращает первое значение someFlag, даже если это статическое поле, которое я изменяю.

1 Ответ

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

Проблема, с которой вы столкнулись, заключается в том, что экземпляр параметра out в настройке отличается от экземпляра, фактически используемого при выполнении теста.

Взято из Moq Quickstart Документация

обратные вызовы для методов с параметрами ref / out возможны, но требуют некоторой работы (и Moq 4.8 или более поздней версии)

Создание делегата для обработки ложного вызова.

 delegate IEnumerable<SomeOtherClass> GetSomethingCallback(DateTime start, DateTime end, out bool someFlag);

В настройках используйте It.Ref<Bar>.IsAny для параметра out и используйте делегата в выражении Returns.

mock
    .Setup(_ => _.GetSomething(It.IsAny<DateTime>(), It.IsAny<DateTime>(), out It.Ref<bool>.IsAny))
    .Returns(new GetSomethingCallback((DateTime start, DateTime end, out bool someFlag) => {
        IEnumerable<SomeOtherClass> otherClasses = GenerateMockedData(start, end);
        //Assign something to someFlag, depending on start and end
        someFlag = true;
        return otherClasses;
    }));

It.Ref<bool>.IsAny инструктирует возвратделегат для взаимодействия со ссылкой на экземпляр фактического объекта, который был передан в проверяемый член.

...