如何使用 NSubstitute 重定向参数



我正在将一些测试对象从 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);
            });

最新更新