gpt4 book ai didi

c# - Moq - 模拟工厂不会在每次迭代时生成新对象

转载 作者:行者123 更新时间:2023-12-03 23:45:55 25 4
gpt4 key购买 nike

我正在尝试最小起订量并测试以下方法:

public List<SkuCountByRetailerVm> GetSkuCountsByRetailer()
{
var viewModels = _factory.GetEmptyListOfSkuCountByRetailerVms();
foreach (var retailer in _helper.GetAllRetailersInReading())
{
var vm = _factory.GetSkuCountsByRetailerVm();
vm.Retailer = retailer;
vm.SkuCount = _helper.GetSkuCountByRetailerInReading(retailer);
viewModels.Add(vm);
}
return viewModels;
}

SkuCountByRetailerVm 类是非常基本的数据传输对象,它具有 Retailer 和 SkuCount 属性。

被测类依赖于 IFactory 和 IHelper,我在测试类中对它们进行了模拟。

看起来被测类的代码没问题。模拟时的问题是我将 3 个相同的 View 模型添加到列表中(都像我希望添加为最后一个的 View 模型),而不是 3 个不同的 View 模型。我认为我的测试的问题是我设置工厂起订量的方式 mockFactory.Setup(m => m.GetSkuCountsByRetailerVm()).Returns(new SkuCountByRetailerVm()); vm 只是指向同一个对象,所以我宁愿每次都实例化一个新的虚拟机?不确定这是否是正确的结论,如果是,如何以不同的方式使用 Moq。

如果需要,我在下面粘贴测试类。


[TestInitialize]
public void Setup()
{
Mock<IReadingHelper> mockHelper = new Mock<IReadingHelper>();
Mock<IVmFactory> mockFactory = new Mock<IVmFactory>();
mockFactory.Setup(m => m.GetEmptyListOfSkuCountByRetailerVms()).Returns(new List<SkuCountByRetailerVm>());

mockFactory.Setup(m => m.GetSkuCountsByRetailerVm()).Returns(new SkuCountByRetailerVm());

mockHelper.Setup(m => m.GetAllRetailersInReading()).Returns(
new List<string> { "Fake1", "Fake2", "Fake3" });
mockHelper.Setup(m => m.GetSkuCountByRetailerInReading("Fake1")).Returns(5);
mockHelper.Setup(m => m.GetSkuCountByRetailerInReading("Fake2")).Returns(10);
mockHelper.Setup(m => m.GetSkuCountByRetailerInReading("Fake3")).Returns(15);

SkuCountByRetailerVmBuilder builder = new SkuCountByRetailerVmBuilder(mockHelper.Object, mockFactory.Object);

_vms = builder.GetSkuCountsByRetailer();
}

最佳答案

Returns method有很多重载。

目前您正在使用签名为 Returns(TResult) 的那个您可以在其中指定要返回的值,并且 Moq 每次调用模拟方法时都使用相同的值(因此您将获得相同的 SkuCountByRetailerVm 实例。

您需要使用一个采用 Func<TResult> as a parameter 的重载。用这个你可以指定一个函数来计算从方法返回的值:

mockFactory.Setup(m => m.GetSkuCountsByRetailerVm())
.Returns(() => new SkuCountByRetailerVm());

使用此设置,每次调用模拟方法时都会获得不同的实例。

关于c# - Moq - 模拟工厂不会在每次迭代时生成新对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36667658/

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