2016-04-16 2 views
2

Я пытаюсь MOq и проверить следующий метод:Moq - насмешливый завод не производит новый объект с каждой итерацией

public List<SkuCountByRetailerVm> GetSkuCountsByRetailer() 
{ 
    var viewModels = _factory.GetEmptyListOfSkuCountByRetailerVms(); 
    foreach (var retailer in _helper.GetAllRetailersInReading()) 
    { 
     var vm = _factory.GetSkuCountsByRetailerVm(); 
     vm.Retailer = retailer; 
     vm.SkuCount = _helper.GetSkuCountByRetailerInReading(retailer); 
     viewModels.Add(vm); 
    } 
    return viewModels; 
} 

Класса SkuCountByRetailerVm очень основной объект передачи данных, он получил Retailer и SkuCount свойства ,

Испытание класса зависит от IFactory и IHelper, оба из которых я издеваюсь над тестовым классом.

Похоже, что код для тестируемого класса в порядке. Проблема, когда насмехается в том, что я получаю 3 одинаковые модели просмотра, добавленные в список (все как тот, который я ожидаю добавить как последний), вместо 3 разных. Я думаю, что проблема с моим тестом заключается в том, что, как я устанавливаю moq фабрики, vm просто указывает на один и тот же объект, поэтому мне бы хотелось, чтобы он каждый раз создавал новый vm? Не уверен, что это правильный вывод, и если да, то как это сделать по-разному с Moq.

Вставьте тестовый класс ниже, если это потребуется.


[TestInitialize] 
public void Setup() 
{ 
    Mock<IReadingHelper> mockHelper = new Mock<IReadingHelper>(); 
    Mock<IVmFactory> mockFactory = new Mock<IVmFactory>(); 
    mockFactory.Setup(m => m.GetEmptyListOfSkuCountByRetailerVms()).Returns(new List<SkuCountByRetailerVm>()); 

    mockFactory.Setup(m => m.GetSkuCountsByRetailerVm()).Returns(new SkuCountByRetailerVm()); 

    mockHelper.Setup(m => m.GetAllRetailersInReading()).Returns(
       new List<string> { "Fake1", "Fake2", "Fake3" }); 
    mockHelper.Setup(m => m.GetSkuCountByRetailerInReading("Fake1")).Returns(5); 
    mockHelper.Setup(m => m.GetSkuCountByRetailerInReading("Fake2")).Returns(10); 
    mockHelper.Setup(m => m.GetSkuCountByRetailerInReading("Fake3")).Returns(15); 

    SkuCountByRetailerVmBuilder builder = new SkuCountByRetailerVmBuilder(mockHelper.Object, mockFactory.Object); 

    _vms = builder.GetSkuCountsByRetailer(); 
} 

ответ

4

Returns method имеет множество перегрузок.

В настоящее время вы используете один с подписью Returns(TResult), где вы можете указать значение для возврата и Moq использовать одинаковое значение каждый раз, когда издевался метод называется (так что вы получите тот же экземпляр вашего SkuCountByRetailerVm.

вы должны использовать один из перегруженных, который принимает Func<TResult> as a parameter с этим можно указать функцию, которая будет вычислять значения для возврата из метода:

mockFactory.Setup(m => m.GetSkuCountsByRetailerVm()) 
      .Returns(() => new SkuCountByRetailerVm()); 

с помощью этой установки вы получите другой экземпляр каждый раз, когда ваш высмеивал метод отклонен.

+0

Спасибо, это работает отлично. – Turo

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