2016-01-13 88 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 ()'。 –