2016-01-13 64 views
0

我正在将一些测试对象从RhinoMocks转换为NSubstitute,并且无法设置我的模拟存储库。如何使用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

+0

如果它有助于看起来像这样的旧代码: _repository.Stub(X => x.SaveStatistics(NULL,NULL)) .IgnoreArguments() .WhenCalled(MI =>的updateItem(( Item)mi.Arguments.First(),(Statistics)mi.Arguments.Second())); –

回答

0

我设法解决它:)参考来自这里的线程与类似的问题。 Arg.Do()

_repository.When(
    x => x.SaveStatistics(Arg.Any<Item>(), statistics)).Do(
     call => 
      { 
       itemUsed = call.Arg<Item>(); 
       UpdateItem(itemUsed, statistics); 
      }); 
+0

有关传递给该函数的'CallInfo'的更多解释:http://nsubstitute.github.io/help/return-from-function/。在这种情况下,你可以使用'(Item)call [0]'或'call.Arg ()'。 –