MOQ - moq действителен только один раз

2

Это мой тестовый тест:

    [Test]
    public void PlayerHasPointsIncreasedOnEnterByFifteen() {
        // Arrange.
        var playerOneFake = new Mock<IEntity>();
        playerOneFake.SetupGet(p => p.Score).Returns(0);
        var pointState = new PointState(playerOneFake.Object);
        // Act.
        pointState.Enter();
        // Assert
        IEntity entity = playerOneFake.Object;
        Assert.AreEqual(15, entity.Score, "Player score is incorrect");
    }

p.Score нужно только возвращать ноль один раз - первый раз, когда я проверяю его в PointState. После этого мне нужна не-посмеянная версия, чтобы проверить, что фактический балл был увеличен в assert.

Я знаю, что вы можете проверить на определенное количество раз - например. Times.Once(), но как мне получить эту функциональность в настройке?

Любые идеи? Это сводит меня с ума.

Приветствия.

Теги:
unit-testing
moq

2 ответа

6
Лучший ответ

Кажется, вы тестируете возвращаемое значение свойства на объект Mock, что на самом деле ничего не доказывает. Вместо этого вы должны проверить, что объект PointState делает ожидаемый вызов в IEntity (возможно, задает свойство Score?), Когда вы вызываете метод Enter объекта PointState.

Предполагая, что он устанавливает свойство Score, вы сделали бы что-то вроде

entity.VerifySet(x => x.Score = 15);
  • 1
    Вот и все. Я не думал проверять это таким образом, и мое сердце было настроено на использование assert. Благодарю.
1

Вместо того, чтобы настраивать свойство с помощью Returns, настройте его с помощью Callback и используйте код, который первый раз возвращает 0, а второй раз вызывает ваш реальный объект. Я никогда не использовал обратный вызов с SetupGet, но он должен быть чем-то вроде этого (код не протестирован, это просто проиллюстрировать идею):

bool alreadyObtainedValue=false;

playerOneFake.SetupGet(p => p.Score).Callback(() => {
  if(alreadyObtainedValue) {
    return realObject.Score;
  } else {
    alreadyObtainedValue=true;
    return 0;
  }
});
Сообщество Overcoder
Наверх
Меню