我通常通过在方法运行后验证对象的状态来进行单元测试,但在某些情况下,我需要测试行为,而不是最终状态。
例如,我需要添加一些代码来减慢执行速度过快的方法。
我知道我们可以通过模拟对象来测试行为,但通常我们不会模拟被测对象,只有协作者。
那么如何在我的单元测试中验证 myObject.MyMethod 正在调用例如 10 次 myObject.WaitFor15ms ?
谢谢
我通常通过在方法运行后验证对象的状态来进行单元测试,但在某些情况下,我需要测试行为,而不是最终状态。
例如,我需要添加一些代码来减慢执行速度过快的方法。
我知道我们可以通过模拟对象来测试行为,但通常我们不会模拟被测对象,只有协作者。
那么如何在我的单元测试中验证 myObject.MyMethod 正在调用例如 10 次 myObject.WaitFor15ms ?
谢谢
假设您需要测试MyObject
类型。
为了测试其内部或受保护的方法,您可以创建MyObjectForTesting
类型、覆盖方法或注入一些可以帮助您测试的逻辑MyObject
。
[TestMethod]
public void DoSmth_InvokesWaitFor15Minutes()
{
//arrange
var list = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
var target = new MyObjectForTesting();
// act
target.DoSmth(list);
// assert
target.WaitFor15MinutesCounter.Should().Be(list.Length);
}
public class MyObject
{
public void DoSmth(int[] list)
{
list.ForEach(it => WaitFor15Minutes());
}
protected virtual void WaitFor15Minutes()
{
}
}
public class MyObjectForTesting : MyObject
{
public int WaitFor15MinutesCounter { get; private set; }
protected override void WaitFor15Minutes()
{
WaitFor15MinutesCounter++;
}
}