gpt4 book ai didi

c# - 最小起订量测试方法 1 是否在同一类中调用第二个方法 2

转载 作者:太空宇宙 更新时间:2023-11-03 14:53:54 27 4
gpt4 key购买 nike

我是最小起订量的新手

我读了很多关于 Moq 测试的文章,你不应该测试你的 mock 对象,相反你应该使用 Moq 来 stub 依赖并让它按照你想要的方式运行。但现在我问自己,你如何测试一个方法是否被同一个类中的另一个方法调用,就像这段代码:

public class A // --> class i want to test
{
public virtual void TestMethod() // --> does it call testmethod2
{
TestMethod2();
}

public virtual void TestMethod2()
{
// Do something
}
}

我以为我可以这样写单元测试:

[TestMethod]
public void MyTestMethod()
{
Mock<A> aMock = new Mock<A>();
aMock.Verify(o => o.TestMethod2(), Times.Once);

aMock.TestMethod();

aMock.VerifyAll();
}

但这有效吗?感谢您提供所有好的答案!

最佳答案

Moq 只能模拟虚拟方法(或为接口(interface)提供模拟实现)。如果您在非虚拟成员上尝试 SetupVerify,您将收到错误

Invalid verify on a non-virtual member: m => m.TestMethod2()

在您的情况下,您需要将 TestMethod2 更改为虚拟的,即

public virtual void TestMethod2()

然后可以测试:

var aMock = new Mock<A>();

aMock.Object.TestMethod();

aMock.Verify(m => m.TestMethod2(), Times.Once);

正如您所建议的,测试一个类是否调用自身内部的方法是一种气味,表明您要么是

  • 测试内部实现细节(例如,如果 TestMethod2() 是私有(private)的,我们甚至都不知道它)。
  • 或者,指示被测类/系统需要重构为多个类,这些类应该松散耦合,因此可以隔离并更好地进行测试。

注意

  • 在调用要测试的 SUT 上的方法之前,您不能验证 调用,即将 Verify 移动到调用 .TestMethod() 正如我所做的那样。
  • 尽管您可以更改代码以使用 Setup + VerifyAll 方法进行测试,即确保您设置的所有内容都被实际调用:

aMock.Setup(m => m.TestMethod2());

aMock.Object.TestMethod();

aMock.VerifyAll();

然而,关于 VerifyAll 的使用是否违反 AAA 原则存在争议(因为您实际上也在指定 Verify 标准Arrange 部分),而且我还发现这种方法无法在大规模测试中重构和干燥 Mock 设置,而且您还会失去一些更精细的检查级别(例如 Times.Once).

关于c# - 最小起订量测试方法 1 是否在同一类中调用第二个方法 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50639944/

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