我应该关心模拟 object 的调用次数吗

Should I care about the number of calls to a mocked object

标题不言自明,但我会详细说明。 我正在使用 FakeItEasy 框架,我可以在其中选择检查方法被调用的次数。

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

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

在很多情况下你应该关心一个依赖被调用的次数。

例如,假设您有一项服务可以通过调用 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 class 时,您将为 data_inserter 构造函数参数创建一个模拟。

在这样的测试中,您需要断言当您使用大小为 Y 的数据调用 SplittingDecorator.Insert 时,模拟的 IDataInserter 被调用了 X 次。

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