设置Moq多次返回默认值,直到它返回特定值

时间:2017-08-15 12:22:34

标签: c# unit-testing moq

我正在尝试对一个等待线程接收特定值的方法调用进行Unittest。该线程每秒从一个接口轮询几次,当没有信息时,它会收到一个默认的消息类型0.但是当线程收到一个大于0的特定消息类型时,它会对它作出反应。我的情况是特定值打破了等待,方法返回结果。但是如何用Moq设置呢?

这个问题不是关于返回一个已知序列,而是返回一个未知的连续序列,直到预期的值为止。

这是我到目前为止所得到的:

        mockedFacade.Setup(facade => facade.RequestPayment()).Callback(
            () =>
            {
                CallbackMessageService.AddMessage(new CallbackMessage{Type = 2, Value = 1});
            }).Verifiable();
        mockedFacade.Setup(facade => facade.GetCallbackMessage()).Returns(CallbackMessageService.GetNextMessage());

我构建了一个用于创建名为CallbackMessageService的消息的测试系统。当外观调用facade.GetCallbackMessage(第二个设置)时,它会返回默认类型为0的消息。在测试期间,我可以调用我的CallbackMessageService并通过CallbackMessageService.AddMessage(第一次设置)向它添加一条消息。下次调用facade.GetCallbackMessage()时,系统将返回该特定消息。

CallbackMessageService可以工作,但问题是GetCallbackMessage(第二个设置)的设置以某种方式缓存它从CallbackMessageService接收的第一条消息。然后它总是返回缓存的消息,并且永远不会再调用CallbackMessageService.GetNextMessage()。我需要设置它,所以只要facade.GetCallbackMessage()是,就会调用CallbackMessageService.GetNextMessage()。

如何使用Moq实现这一目标?

我认为缓存是Moq中的默认设置,我知道SetupSequence。问题是我无法控制在返回特定值之前我必须处理多少个默认值。

我删除了一些代码来尝试隔离问题。如果没有什么背景,请告诉我。

1 个答案:

答案 0 :(得分:0)

在我发布问题之后,我继续修补代码并找到了解决方案。此解决方案仅起作用,因为我测试的系统在它再次调用facade.GetCallbackMessage()之前调用另一个名为facade.CallbackMessageProcessed的方法。我可以像这样使用这个优势:

mockedFacade.Setup(facade => facade.RequestPayment()).Callback(
    () =>
    {
        CallbackMessageService.AddMessage(new CallbackMessage{Type = 2, Value = 1, MessageID = Guid.NewGuid().ToString()});
    }).Verifiable();
mockedFacade.Setup(facade => facade.GetCallbackMessage()).Returns(CallbackMessageService.GetNextMessage());
mockedFacade.Setup(facade => facade.CallbackMessageProcessed(It.IsAny<CallbackMessage>())).Callback(
    (CallbackMessage c) =>
    {
        CallbackMessageService.MessageResolved(c);
        mockedFacade.Setup(facade => facade.GetCallbackMessage()).Returns(CallbackMessageService.GetNextMessage());
    });

每当调用CallbackMessageProcessed时,我都会创建一个回调,我重做设置。这将继续循环,直到测试完成。所以这是解决这个问题的一种方法。

我也尝试在我的facade.GetCallbackMessage()回调中进行设置,但是没有用。

虽然这是我的具体案例的答案,但如果您没有第二种方法,那么在预期另一次返回之前是否有办法允许Moq中的设置允许多个未知数量的返回将是很好的像我一样。