2012-05-14 2 views
1

Ниже фрагмент кода лучше всего объясняет, что я пытаюсь достичь:MOQ - Проверьте приращением свойство вызова

[Test] 
public void ReplayGoalTeamATest() 
{ 
    var stateMachineMock = new Mock<IIceHockeyOddsStateMachine>(); 

    new IceHockeyActionLogRecord { Event = "goal", Team = "A"}.Replay(stateMachineMock.Object); 

    stateMachineMock.Verify(s=>s.TeamAScore++); //Syntax error 
} 
+1

Смотрите мое обновление для случая, когда свойство имеет только сеттер (кстати, в этом случае лучше использовать метод, чем собственность) –

+0

Великих, спасибо. Я удалил тест редактирования из вопроса, так как понял, что TeamAScore ++ - это глупость для пропеллера с геттером, и я согласен, что опорой с только сеттером должен быть мехтод. –

ответ

1

Когда вы s.TeamAScore++ то у вас есть два различных действия, которые вы должны настроить и проверить. Первое действие получает текущий счет от вашей зависимости, и второе действие устанавливает новый счет:

int score = stateMachine.TeamAScore; 
// other staff 
stateMachine.TeamAScore = score + 1; 

Так что, я бы с явным определением этого взаимодействия с зависимостью:

// Arrange 
Mock<IIceHockeyOddsStateMachine> stateMachineMock = new Mock<IIceHockeyOddsStateMachine>(); 
stateMachineMock.SetupGet(s => s.TeamAScore).Returns(0); 
IceHockeyActionLogRecord record = new IceHockeyActionLogRecord { Event = "goal", Team = "A"}; 
// Act 
record.Replay(stateMachineMock.Object); 
// Assert 
stateMachineMock.VerifySet(s => s.TeamAScore = 1); 

В этом случае вы тестируют ваш IceHockeyActionLogRecord, способ взаимодействия с зависимостями. Тест становится спецификацией взаимодействия между объектами.

Когда вы проверяете значение TeamAScore, вы вместо этого проверяете макетную реализацию. Также использование Callback будет проверять ваш код, а не тестировать взаимодействие между объектами.

Кроме того, я хотел бы дать имена для магических чисел внутри теста, или даже обеспечить параметры:

[TestCase(0, 1)] 
[TestCase(50, 51)] 
public void ShouldIncrementTeamScore(int initialScore, int expectedScore) 
{ 
    var stateMachineMock = new Mock<IIceHockeyOddsStateMachine>(); 
    stateMachineMock.SetupGet(s => s.TeamAScore).Returns(initialScore); 
    IceHockeyActionLogRecord foo = new IceHockeyActionLogRecord(); 
    foo.Replay(stateMachineMock.Object); 
    stateMachineMock.VerifySet(s => s.TeamAScore = expectedScore);    
} 

UPDATE: если ваш интерфейс не имеет поглотитель для имущества, а затем просто изменить Устройте часть теста (не свойство установки геттера вызова):

// Arrange 
var stateMachineMock = new Mock<IIceHockeyOddsStateMachine>(); 
var record = new IceHockeyActionLogRecord { Event = "goal", Team = "A"}; 
// Act 
record.Replay(stateMachineMock.Object); 
// Assert 
stateMachineMock.VerifySet(s => s.TeamAScore = 1); 
0

есть у попытался с помощью метода .CallBack() вместо этого? Не уверен Проверьте опоры выше реализации

+0

Нет, вышесказанное не компилируется. Использование обратного вызова; проблема остается, как выразить ожидание того, что TeamAScore будет увеличиваться? –

2

Если у вас есть как поглотитель и сеттер на интерфейсе IIceHockeyOddsStateMachine, вы можете проверить, что значение было увеличено, как это:

var stateMachineMock = new Mock<IIceHockeyOddsStateMachine>(); 

stateMachineMock.SetupAllProperties(); 

stateMachineMock.Object.TeamAScore = 0; 

new IceHockeyActionLogRecord { Event = "goal", Team = "A"}.Replay(stateMachineMock.Object); 

Assert.That(stateMachineMock.Object.TeamAScore, Is.EqualTo(1)); 
+0

Это будет хорошо, спасибо Дэн, очевидно! –

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