C# 不能';t传递到对象列表c中的模拟的设置方法#
我在嘲笑时遇到了一些问题C# 不能';t传递到对象列表c中的模拟的设置方法#,c#,asp.net,.net,unit-testing,moq,C#,Asp.net,.net,Unit Testing,Moq,我在嘲笑时遇到了一些问题 private Mock<IPaymentHandler> _mockRecurringPaymentHandler; private Mock<IPaymentHandler> _mockRecurringPaymentFailedHandler; private IEnumerable<IPaymentHandler> _paymentManagers; _mockRecurringPaymentHandler = new
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
);
它不起作用。只有在我将其传递到列表之前执行该操作,它才有效。
为什么会有这样的行为
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;
}
publicpayipnmanager(
i无数的薪酬管理人员,
iLogger(服务记录器)
{
_handlersDic=注册策略(paymentHandlers);
_记录器=记录器;
}
受保护的字典注册策略(IEnumerable paymentHandlers)
{
var dic=新字典();
foreach(paymentHandlers中的var处理程序)
{
var paymentType=handler.GetPaymentType();
dic.Add(付款类型,经办人);
}
返回dic;
}
记住,单元测试是在AAA的概念上工作的——安排、执行和断言。除非你把事情安排得不恰当,否则act不会按要求工作
因此,在这里,当调用
paypaipnmanager
构造函数时,它将调用您的RegisterStrategy
,它将为您的模拟处理程序调用GetPaymentType
。因为在调用构造函数之前,没有设置GetPaymentType
,所以在测试中没有调用设置方法GetPaymentType
。因此,在这里,您应该在调用构造函数之前定义GetPaymentType
设置 理想情况下,它应该一直工作,直到您不更改\u mockRecurringPaymentHandler
或PayPaiInManager
本身调用尚未定义的GetPaymentType
的引用为止,因此您应该在传递ListOK之前定义它,但是,如果我们向sut传递的不是list而是单个对象,然后在其中一个方法中进行设置,那么为什么同样的方法会起作用呢?对于list,它有不同的行为?问题中显示的所有代码是否都存在于一个方法中?否,_paymentManagers=new list{u mockRecurringPaymentHandler.object,_mockRecurringPaymentFailedHandler.object}; _sut=新的PayPaiPNManager(_PaymentManager,_mockLogger.Object);它存在于设置方法中
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;
}