Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 不能';t传递到对象列表c中的模拟的设置方法#_C#_Asp.net_.net_Unit Testing_Moq - Fatal编程技术网

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;
        }