我正在将一些测试对象从 RhinoMocks 转换为 NSubstitute,并且在设置我的模拟存储库时遇到问题。
请参阅下面的单元测试代码:
[SetUp]
public void SetUp()
{
_converter = Substitute.For<IStatisticsConverter>();
_repository = Substitute.For<IRepository>();
_updater = new StatisticsUpdater(_converter, null, _repository);
}
[Test]
public void CreateFrom_NoExistingItem_NewItemWithStatistics()
{
var statisticsLog = new StatisticsLog();
var statistics = new Statistics();
_converter.ConvertToStatistics(statisticsLog).Returns(statistics);
_repository.When(x => x.SaveStatistics(Arg.Any<Item>(), statistics))
.Do(x => UpdateItem(?????,statistics));
var actualItem = _updater.CreateFrom(statisticsLog);
Assert.IsNotNull(actualItem);
Assert.AreEqual(1, actualItem.Statistics.Count(), "number of statistics entries");
Assert.AreSame(statistics, actualItem.Statistics.First(), "expected statistics");
}
private void UpdateItem(Item item, Statistics statistics)
{
item.AddStatistics(statistics);
}
测试在Assert.AreEqual
抛出错误:"预期为 1,实际为 0。
发生的情况是,_updater
是被测系统。CreateFrom()
函数创建一个新Item()
,然后在内部调用Update(statisticsLog)
。 StatisticsLog
是一个 XML 文件。
public Item CreateFrom(T deserializedEntity)
{
Item = new Item();
Update(deserializedEntity);
return Item;
}
一旦文件在真正的更新程序中被解析,它就会被保存到附加到新Item
的数据库中(该数据库也被添加到数据库中,因为它以前不存在(。
现在,问题是,我需要获取这个新Item
并将其传递到模拟添加到数据库的功能的UpdateItem()
中。它将Statistics
添加到Item.Statistics
列表中。
那么 - 有没有办法我可以从被嘲笑的Repository
中提取这个论点并将其传递给UpdateItem
?
我设法解决了它:)参考来自此线程,此处存在类似问题。Arg.Do((
_repository.When(
x => x.SaveStatistics(Arg.Any<Item>(), statistics)).Do(
call =>
{
itemUsed = call.Arg<Item>();
UpdateItem(itemUsed, statistics);
});