标题是自我解释的,但我会详细说明。 我使用FakeItEasy框架,我可以选择检查方法被调用的次数。
A.CallTo(() => foo.Bar()).MustHaveHappened();
但通过这样做,我测试了代码的内部行为。我没有测试返回值或状态更改,这是一个好的测试应该做的。 所以我的问题是:测试一个方法被调用的次数是一个好习惯吗?
答案 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次。