2015-10-19 50 views
-1

我需要模拟一个方法以及它的返回值,它是一个对象。下面是我在主类嘲笑+ C#中捕获方法的返回值问题#

//**Main Class** 
var message = CorrelationMessageClient.GetCorrelationMessage(
     orderRequest.OrderId, CorrelationMessageType.CorrelationFix); 
if (message != null && !string.IsNullOrEmpty(message.CorrelationId)) 
{ 
     sendOrderResponse = PrepareExecutionReport(
       new MessageManager(message.ResponseMessage)); 
} 

CorrelationMessageClient.GetCorrelationMessage的返回类型为类型CorrelationMessage对象的代码。

在我的单元测试我已经嘲笑如下

//**Unit Test class** 
private Mock<ICorrelationMessageClient> _mockCorrelationMessageClient; 
_mockCorrelationMessageClient = new Mock<ICorrelationMessageClient>(); 

var correlationResponse = new CorrelationMessage { 
    CorrelationId = "1212121",ResponseMessage = "Response Successful"}; 

_mockCorrelationMessageClient.Setup(x => 
    x.GetCorrelationMessage(correlationMessageFix.CorrelationId, 
     correlationMessageFix.CorrelationMessageType)) 
     .Returns(correlationResponse); 

当调试主类代码,我看到被传递给GetCorrelationMessage方法的值,但该消息变量保持为空。为什么当我在下面的设置方法中写回Return语句时,它为空

_mockCorrelationMessageClient.Setup(x => 
    x.GetCorrelationMessage(correlationMessageFix.CorrelationId, 
     correlationMessageFix.CorrelationMessageType)) 
     .Returns(correlationResponse); 

回答

0

看起来像您正在使用Moq。在这种情况下,方法的实际调用参数只有在.Setup方法中使用时才需要匹配,或者您可以允许任何特定的匹配函数。即It.IsAny<T>允许特定的参数值都:

_mockCorrelationMessageClient.Setup(x => 
    x.GetCorrelationMessage(It.IsAny<TypOfId>(), It.IsAny<TypeOfMessageType>())) 
    .Returns(correlationResponse); 

否则你会得到默认的实现方法,将返回默认值结果类型(空引用类型)的。

请注意,您应该致电It.IsAny内嵌.Setup - What is the difference between passing It.IsAny<int>() and the value of It.IsAny<int>() to a method setup