2014-02-13 2 views
0

я следующий блок испытанияMoq больше не использует метод возврата при использовании последовательности

[Test] 
public void FifoOrderTest() 
{ 
    // Arrange 
    var sequence = new MockSequence(); 
    var mockFoo1 = new Mock<IBar>(); 
    var mockFoo2 = new Mock<IBar>(); 
    mockFoo1.InSequence(sequence) 
      .Setup(foo => foo.Baz) 
      .Returns(100); 
    mockFoo2.InSequence(sequence) 
      .Setup(foo => foo.Baz) 
      .Returns(10000); 

    // Act 
    sut.AddFoo(mockFoo1.Object); 
    sut.AddFoo(mockFoo2.Object); 
    sut.RunFoos(); 

    // Arrange 
    mockFoo1.Verify(foo => foo.Something(100)); 
    mockFoo2.Verify(foo => foo.Something(700)); 
} 

Моя проблема заключается в том, что Moq не использует возвратные функции обратного вызова, которые я установил на mockFoo1 и mockFoo2. Вместо этого, когда моя тестируемая система получает доступ к свойству Baz, возвращается значение по умолчанию 0. Если я удалю последовательность, то она снова будет работать так, как ожидалось.

Что я делаю неправильно? Есть где-то полный рабочий пример?

ответ

0

Попробуйте создать метод, позволяющий присвоить значение свойства Baz, например, SetProperty().

Затем попробуйте использовать свой foo.SetProperty вместо свойства! ;) Он будет работать!

0

Вы уверены, что ваш SUT правильный?

Со следующим SUT и IBar теста, кажется, работает как задумано:

public class Sut 
{ 
    List<IBar> _barList = new List<IBar>(); 
    public void AddFoo(IBar bar) 
    { 
     _barList.Add(bar); 
    } 

    public void RunFoos() 
    { 
     foreach (var bar in _barList) 
     { 
      var barProperty = bar.Baz; 
      if (barProperty == 100) bar.Something(100); 
      if (barProperty == 10000) bar.Something(700); 
     } 
    } 
} 

public interface IBar 
{ 
    int Baz { get; } 
    void Something(int def); 
} 

Я использую Moq 4.2.1402

Обратите внимание, что каждый фиктивный свойство .Baz можно прочитать только один раз перед этапы последовательности на

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