gpt4 book ai didi

moq - 如何验证使用 Moq 调用类中的另一个方法

转载 作者:行者123 更新时间:2023-12-03 15:16:30 28 4
gpt4 key购买 nike

这看起来很简单,但我似乎无法让它工作。

我有一个带有 Save 方法的类,它只调用另一个方法 ShouldBeCalled()。我想验证如果我调用 Save() 另一个方法 ShouldBeCalled() 至少执行一次。我认为我可以做到以下几点。

public class ClassA
{
public virtual void Save()
{
ShouldBeCalled();
}

public virtual void ShouldBeCalled()
{
//This should get executed
}
}

[TestFixture]
public class ClassA_Test
{
[Test]
public void Save_Should_Call_ShouldBeCalled()
{
var mockClassA = new Mock<ClassA>();
mockClassA.Object.Save();

mockClassA.Verify(x => x.ShouldBeCalled(), Times.AtLeastOnce());
}
}

但是我得到了异常“至少一次对模拟的预期调用,但从未执行过:x => x.ShouldBeCalled()”

这只是一个猜测,但 Moq 是否用它自己的版本覆盖了 Save() 方法,它忽略了我在真实对象的 Save() 方法中的任何内容。

最佳答案

你遇到这个问题是因为你在 mock 你正在测试的东西。这没有意义。

您是正确的,Moq 将用自己的方法替换您的方法的实现。原因是你应该使用 Moq 来模拟你正在测试的类调用的东西,而不是你正在测试的类本身。

如果您的代码是这样设计的,则此测试将是合适的:

public class ClassA
{
BusinessLogicClass bl;
public ClassA(BusinessLogicClass bl)
{
this.bl = bl;
}

public void Save()
{
bl.ShouldBeCalled();
}
}

public class BusinessLogicClass
{
public virtual void ShouldBeCalled()
{
//This should get executed
}
}

这是现在对该方法的正确测试:
[TestFixture]
public class ClassA_Test
{
[Test]
public void Save_ShouldCallShouldBeCalled()
{
//Arrange
var mockBLClass = new Mock<BusinessLogicClass>();
mockBLClass.Setup(x => x.ShouldBeCalled()).Verifyable();

//Act
ClassA classA = new ClassA(mockBLClass.Object);
classA.Save();

//Assert
mockBLClass.VerifyAll();
}
}

这里的关键教训是您模拟/ stub 测试需要运行的内容,而不是您正在测试的内容。

希望这可以帮助,
安德森

关于moq - 如何验证使用 Moq 调用类中的另一个方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1417048/

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