【发布时间】:2018-04-25 09:00:53
【问题描述】:
在嘲笑我时遇到了一些问题。
private Mock<IPaymentHandler> _mockRecurringPaymentHandler;
private Mock<IPaymentHandler> _mockRecurringPaymentFailedHandler;
private IEnumerable<IPaymentHandler> _paymentManagers;
_mockRecurringPaymentHandler = new Mock<IPaymentHandler>();
_mockRecurringPaymentFailedHandler = new Mock<IPaymentHandler>();
_paymentManagers = new List<IPaymentHandler>
{
_mockRecurringPaymentHandler.Object,
_mockRecurringPaymentFailedHandler.Object
};
_sut = new PaypaIIpnManager(
_paymentManagers,
_mockLogger.Object
);
最近我尝试为mockRecurringPaymentHandler 设置一个方法,例如下面:
_mockRecurringPaymentHandler.Setup(method => method.GetPaymentType()).Returns("GFDGDFGDFG");
它不起作用。仅当我在将其传递给列表之前执行此操作时才有效。 为什么会有这样的行为?
public PaypaIIpnManager(
IEnumerable<IPaymentHandler> paymentHandlers,
ILoggerService<PaypaIIpnManager> logger)
{
_handlersDic = RegisterStrategy(paymentHandlers);
_logger = logger;
}
protected Dictionary<string, IPaymentHandler> RegisterStrategy(IEnumerable<IPaymentHandler> paymentHandlers)
{
var dic = new Dictionary<string, IPaymentHandler>();
foreach (var handler in paymentHandlers)
{
var paymentType = handler.GetPaymentType();
dic.Add(paymentType, handler);
}
return dic;
}
【问题讨论】:
-
理想情况下,它应该可以工作,直到您不更改
_mockRecurringPaymentHandler或PaypaIIpnManager的引用本身调用尚未定义的GetPaymentType,因此您应该在传递列表之前定义它 -
好的,但是如果我们传递的不是列表而是单个对象,为什么相同的方法可以工作,然后在其中一种方法中进行设置?
-
对于列表它有不同的行为?
-
是否所有显示的代码都存在于一种方法中?
-
不,_paymentManagers = 新列表
{ _mockRecurringPaymentHandler.Object, _mockRecurringPaymentFailedHandler.Object }; _sut = new PaypaIIpnManager(_paymentManagers, _mockLogger.Object);它存在于 Setup 方法中
标签: c# asp.net .net unit-testing moq