c# - 无法设置将模拟传递到对象列表中的方法c#
问题描述
在嘲笑我遇到了一些问题。
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;
}
解决方案
请记住,单元测试基于 AAA 的概念 --- Arrange、Act 和 Assert。除非您没有适当地安排事情,否则行为不会按要求进行。
所以在这里,当PaypaIIpnManager
构造函数被调用时,它会调用你的RegisterStrategy
which 调用GetPaymentType
你的模拟处理程序。由于在调用构造函数之前,GetPaymentType
未设置,这就是为什么在您的测试GetPaymentType
中未调用设置方法的原因。所以在这里,你应该GetPaymentType
在调用构造函数之前定义设置。
推荐阅读
- multithreading - 模拟器不起作用/在展开可选值时意外发现 nil/if else 代码问题
- java - 我如何在某个视角内与另一个代理(anylogic)进行通信?
- jenkins - 管道中每个阶段的 Jenkins 构建日志
- maven - jOOQ 不能自动生成类
- asp.net - 将 Web 应用程序发布到 IIS 时出现 HTTP 500 错误
- java - java.lang.AssertionError: Status expected:<200> but was:<404> 测试用例失败
- javascript - 通过绕过缓存强制浏览器使用 HTTP 或 HTTPS 打开网页
- c++ - 颜色未显示在 OpenGL 窗口中
- javascript - 想要修复联系表格,直到我们进入该特定部分
- python - 在 Beautifulsoup 的网络文章中查找某些名词