如何验证在单元测试中调用内部方法?

时间:2013-11-06 13:39:58

标签: unit-testing mocking

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

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

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

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

由于

1 个答案:

答案 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++;
        }
    }