2016-01-13 1 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 и Actual 0."

Что происходит, _updater - это системный тест. Функция CreateFrom() создает новый Item(), а затем внутренне вызывает Update(statisticsLog). StatisticsLog - это XML-файл.

public Item CreateFrom(T deserializedEntity) 
{ 
    Item = new Item(); 

    Update(deserializedEntity); 

    return Item; 
} 

После того, как файл обрабатывается в реальном Updater, оно сохраняется в базе данных, которая прилагается к новому Item (который также был добавлен в базу данных, как это раньше не было).

Теперь проблема заключается в том, что мне нужно получить эту новинку Item и передать ее в UpdateItem(), которая издевается над функциональностью добавления в базу данных. Он добавляет Statistics в список Item.Statistics.

Итак - есть ли способ вытащить этот аргумент из насмешливого Repository и передать его в UpdateItem?

+0

Если это помогает старый код выглядел следующим образом: _repository.Stub (х => x.SaveStatistics (NULL, NULL)) .IgnoreArguments() .WhenCalled (миль => 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) [0]' или 'call.Arg ()'. –

Смежные вопросы