我通常通过在运行方法后验证对象的状态进行单元测试,但在某些情况下我需要测试行为,而不是最终状态。
例如,我需要添加一些代码来减慢执行速度过快的方法。
我知道我们可以通过模拟对象来测试行为,但通常我们不会模拟测试中的对象,只会模仿协作者。
那么如何在我的单元测试中验证myObject.MyMethod调用10次myObject.WaitFor15ms?
由于
答案 0 :(得分:2)
假设您需要测试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++;
}
}