我是单元测试新手,正在为 .NET C# 应用程序编写单元测试。为了创建模拟,我在测试项目中使用 MOQ NuGet 包。我有一个具有两个属性的接口:
public interface IUserInput
{
public int FirstInput { get; set; }
public int SecondInput { get; set; }
}
我有一个使用此接口的类:
public class CalculatorCore : ICalculatorBase
{
private readonly IUserInput _input;
public CalculatorCore(IUserInput input)
{
_input = input;
}
public int AddByUserInput()
{
_input.SecondInput += 2;
return _input.FirstInput + _input.SecondInput;
}
}
对于这个类,我编写了一个测试类和一个测试方法:
[TestClass]
public class CalculatorCoreTest
{
[TestMethod]
public void AddByUserInput()
{
Mock<IUserInput> userInputMock = new Mock<IUserInput>();
userInputMock.SetupProperty(f => f.FirstInput, 1);
userInputMock.SetupProperty(f => f.SecondInput, 1);
var calculatorCore = new CalculatorCore(userInputMock.Object);
var actual = calculatorCore.AddByUserInput();
Assert.AreEqual(actual, 4);
}
}
这个测试通过了,我没有任何问题。
然而,当我删除线
userInputMock.SetupProperty(f => f.SecondInput, 1);
并将代码的断言部分更改为
Assert.AreEqual(actual, 3);
测试失败,我的结果是1。发生这种情况是因为当我将 2 添加到模拟对象属性时,它仍然等于 0;
为什么我无法更改尚未设置的模拟对象属性的值?
如果没有设置,则无法设置该属性。为了使其直观,它的行为类似于以下属性:
int SecondInput { set {} get => default; }
所以它总是会返回
0
。