gpt4 book ai didi

c# - 通过使用 moq 模拟另一个方法来测试一个方法是否被调用

转载 作者:行者123 更新时间:2023-11-30 17:48:01 27 4
gpt4 key购买 nike

给定一个具有方法 SplitList 和 Update 的类。正在从 SplitList 调用更新。

class BaseClass
{
public void SplitList(ref IList<Type> objList)
{
IList<Type> SplitA = objList.Where(c=>c.currency == "USD").ToList();
IList<Type> SplitB = objList.Where(c=>c.currency == "GBR").ToList();

if(SplitA.Count() > 0)
{
Update(ref SplitA);
}

if(SplitB.Count() > 0)
{
Update(ref SplitB);
}
}
}

我想测试的是当我调用 SplitList 方法时,Update 被调用了多少次。我的意思是如果两者都被调用,或者一个,或者没有。需要测试该方法的边界条件。

我是如何进行的,

class TestClass
{
[TestMethod]
void TestSplitList()
{
Mock<BaseClass> mock = new Mock<BaseClass>();
mock.Setup(m=>m.Update(ref List)).Verifiable();
mock.Object.SplitList(ref List);
mock.Verify(m=>m.Update(ref List), Times.Exactly(1));
}
}

这段代码给我错误,预期在 mock 上恰好调用 1 次,但实际是 0 次:m => m.Update(.List)

有人可以帮忙吗?

最佳答案

您的 SplitList 方法是虚拟的吗? (因为您发布的代码可能与代码库不同。)在这种情况下,Moq 将覆盖它并且您的 Update 将不会被调用。您可以使其成为非虚拟的,或者通过添加以下行让 Moq 调用它:

mock.CallBase = true;

如果您选择这种方法,请注意所有 方法都将“CallBase”(如果没有期望覆盖成员)。

更新:您将不同的列表传递给 SplitList 实现中的 Update 方法。参数是 objList,然后您创建不同的列表(SplitASplitB)并将其中一个传递给 Update方法。由于 SplitA(或 SplitB)!= objList,测试失败。

你真的必须在这里使用 ref 吗?如果你删除它,代码会更简单,测试也会通过。 如果没有 ref,列表仍然会不同,抱歉我错过了。我认为您可能需要更改逻辑以允许更好的测试..

关于c# - 通过使用 moq 模拟另一个方法来测试一个方法是否被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23823125/

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