我应该关心对模拟对象的调用次数

时间:2015-11-14 19:56:09

标签: unit-testing fakeiteasy

标题是自我解释的,但我会详细说明。 我使用FakeItEasy框架,我可以选择检查方法被调用的次数。

A.CallTo(() => foo.Bar()).MustHaveHappened();    

但通过这样做,我测试了代码的内部行为。我没有测试返回值或状态更改,这是一个好的测试应该做的。 所以我的问题是:测试一个方法被调用的次数是一个好习惯吗?

1 个答案:

答案 0 :(得分:1)

您应该关心在很多情况下调用依赖项的次数。

例如,假设您有一个服务通过调用Web服务将某些数据插入到某个数据库中。

public interface IDataInserter
{
    void Insert(Data[] data);
}

并假设在某些情况下您需要插入大约10000个项目。但是,Web服务无法在一次调用中处理如此大量的数据。因此,您决定创建一个装饰器,将数据拆分为多个块,并在一个请求中发送每个块。

public class SplittingDecorator : IDataInserter
{
    private readonly IDataInserter m_DataInserter;

    public SplittingDecorator(IDataInserter data_inserter)
    {
        m_DataInserter = data_inserter;
    }

    public void Insert(Data[] data)
    {
        var chunks = 
            data
            .Select((d, i) => new {d, i})
            .GroupBy(x => x.i/50)
            .Select(x => x.Select(y => y.d).ToArray())
            .ToList();

        foreach (var chunk in chunks)
        {
            m_DataInserter.Insert(chunk);
        }
    }
}

当您想测试SplittingDecorator类时,您将为data_inserter构造函数参数创建一个模拟。

在这样的测试中,当你使用大小为Y的数据调用IDataInserter时,你需要声明被模拟的SplittingDecorator.Insert被调用了几次。

例如,如果数据大小(data数组的长度)是160个项目,则需要检查模拟是否被调用了4次。