0

我通常通过在方法运行后验证对象的状态来进行单元测试,但在某些情况下,我需要测试行为,而不是最终状态。

例如,我需要添加一些代码来减慢执行速度过快的方法。

我知道我们可以通过模拟对象来测试行为,但通常我们不会模拟被测对象,只有协作者。

那么如何在我的单元测试中验证 myObject.MyMethod 正在调用例如 10 次 myObject.WaitFor15ms ?

谢谢

4

1 回答 1

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++;
        }
    }
于 2013-11-06T14:33:14.980 回答