我正在尝试为我的代码设置一个简单的单元测试。我有一个通过WCF与外部服务通信的接口和实现。我试图用下面的代码嘲笑这个;
private Mock<IPayments> _mockIPayments;
_mockIPayments.Setup(x => x.GetCreditCard(It.IsAny<GetCreditCardRequest>())).Returns(getCreditCardResponse);
在单元测试中,我创建了一个最终调用WCF服务的服务实例;
var paymentService = new PaymentService();
var response = paymentService.GetCardDetails(cardId);
在PaymentService本身内,代码;
var response = ServiceInvoker.Invoke<IPayments, GetCreditCardRequest, GetCreditCardResponse>
(
"Payments",
request,
(proxy, req) => proxy.GetCreditCard(req));
(请注意,ServiceInvoker.Invoke只是创建频道和处理请求的包装器)
我是否遗漏了某些内容,如果模拟设置没有捕获到GetCreditCard的请求?
ETA
为了使它更清晰,流程是;
UnitTest - &gt; PaymentsService - &gt; IPayments
答案 0 :(得分:1)
您需要以某种方式将您的模拟实例传递给服务。
var paymentService = new PaymentService(_mockIPayments.Object);
答案 1 :(得分:0)
简单地指定设置不会让Moq用您指定的内容替换某些接口的所有实例。它只是定义了当调用某个Mock
实例时Moq将返回的内容。在您的情况下_mockIPayments
。
然后,您必须在代码中使用该模拟的IPayments
实例(在构造函数或方法中传递它),以便您的代码实际使用它。
如果您的PaymentService
当前正在内部创建IPayments
对象,要使用模拟,您必须使用依赖注入之类的内容,以便您能够在外部指定IPayments
实例,因此在测试中提供了一个模拟实例。
同样地:
var paymentService = new PaymentService(_mockIPayments.Object);