我应该关心模拟 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 次。
标题不言自明,但我会详细说明。 我正在使用 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 次。