如何使用 moq 断言在 c# 中调用函数
本文关键字:调用 函数 何使用 moq 断言 | 更新日期: 2023-09-27 18:33:21
我正在尝试学习如何使用Moq使用C#进行单元测试。我设置了一个简单的类,BasicMath,它有一个函数int Multiply(int a, int b)
,主体只返回一个* b。我有另一个叫做AdvancedMath的类,它有一个函数'int Square(int a)',主体调用Multiply(a,a)并返回结果。
我正在尝试为AdvancedMath.Square编写一个简单的测试,该测试将断言BasicMath.Multiply是使用正确的值调用的。我知道你不能用普通的公共功能做到这一点,所以我把功能变成了虚拟的,但我仍然遇到麻烦。有人可以向我解释这是如何完成的吗?除了默认的空构造函数之外,这两个类都没有其他构造函数。
这是我的尝试:
class test_Advanced_Functions
{
[Test]
public void test_SquareFunction_Should_return_correct_result()
{
// Arrange
Mock<BasicFunctions> mock = new Mock<BasicFunctions>();
AdvancedFunctions af = new AdvancedFunctions();
// Act
int result = af.Square(5);
//Assert
mock.Verify(d => d.Multiply(5, 5), Times.Exactly(1));
}
假设AdvancedMath
派生自BasicMath
那么当Multiply
是虚拟的时,您可以使用 Moq 进行测试:
var mock = new Mock<AdvancedMath>();
mock.Setup(m => m.Multiply(2, 2)).Returns(4);
mock.Object.Square(2);
mock.VerifyAll();
如果您在AdvancedMath
中使用BasicMath
(即,如果Multiply
是静态的并且直接从Square
调用),则无法使用 Moq 测试此类交互。要了解原因,请参阅此问题。
但是,在这种简单的情况下进行基于行为的验证似乎并不正确。您需要回答自己一个问题:"我想测试什么?Square
有效还是调用某些方法?此测试(您现在计划执行的操作)仅将责任委托给Multiply
,假设它有效。您的Square
实现可能会以多种方式更改(例如,不使用Multiply
),并且会破坏您的测试 - 它不应该。
Moq
无法修改它尚未创建的实例的行为。
您应该通过练习依赖注入来编写可进行单元测试的类。由于AdvancedFunctions
显然依赖于BasicFunctions
,它应该有一个作为构造函数参数传入的BasicFunctions
,而不是自己new
一个。