gpt4 book ai didi

c# - 如何使用 Moq 从模拟对象返回实际对象

转载 作者:太空宇宙 更新时间:2023-11-03 12:36:34 25 4
gpt4 key购买 nike

假设我有这个被模拟过的方法:

public Comfirmation AddCustomer(Customer customer)
{
// add customer to the Database
return confirmation;
}

我的模拟是这样的:

_service
.Setup(x =>x.AddCustomer(It.IsAny<Customer>))
.Returns(new Confirmation());

如何从实际方法中获取确认对象/状态?我知道模拟的目的是隔离影响代码行为的外部因素,但我确实需要获得实际方法的计算结果。因为这个结果将用于测试的其他部分。

最佳答案

Moq 不执行类的AddCustomer 函数。因此,您当前的 Moq 设置无法获取 Confirmation 对象,AddCustomer 的真正实现可能已经创建。

如果您需要 Confirmation 作为另一个测试的输入,那么测试的 arrange 部分的作用是为被测方法创建输入参数.

如果您通过调用 AddCustomer 函数来解决这个问题,那么您就创建了 Confirmation 创建代码和使用确认书。如果创建代码发生更改,测试可能会在其他区域中断,并且调试原因可能既困难又耗时

对于集成测试,这种耦合是正确的选择,因为您要测试软件的两个部分之间的交互。对于单元测试,我建议将 AddCustomer 功能与其他部分分离。

另一种方法是创建可能已创建 AddCustomer 函数的 Confirmation 对象。这可以手动完成,或者对于更复杂的对象,通过一些捕获/重放方法(例如,将 AddCustomer 函数中的合适的 Confirmation 对象序列化为 XML 或 JSON 并创建 Confirmation object for the mock in other test 通过反序列化器解析静态 XML 或 JSON 字符串。例如

 string capturedJson = "...."; // <= JSON of a Confirmation object
var confirmation = JsonConvert.DeserializeObject<Confirmation>(capturedJson);
_service
.Setup(x =>x.AddCustomer(It.IsAny<Customer>))
.Returns(confirmation);

target.SomeConfirmationObjectUsingFunction(_service);

关于c# - 如何使用 Moq 从模拟对象返回实际对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40762628/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com