Это мой тестовый тест:
[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(), но как мне получить эту функциональность в настройке?
Любые идеи? Это сводит меня с ума.
Приветствия.
Кажется, вы тестируете возвращаемое значение свойства на объект Mock, что на самом деле ничего не доказывает. Вместо этого вы должны проверить, что объект PointState делает ожидаемый вызов в IEntity (возможно, задает свойство Score?), Когда вы вызываете метод Enter объекта PointState.
Предполагая, что он устанавливает свойство Score, вы сделали бы что-то вроде
entity.VerifySet(x => x.Score = 15);
Вместо того, чтобы настраивать свойство с помощью Returns
, настройте его с помощью Callback
и используйте код, который первый раз возвращает 0, а второй раз вызывает ваш реальный объект. Я никогда не использовал обратный вызов с SetupGet
, но он должен быть чем-то вроде этого (код не протестирован, это просто проиллюстрировать идею):
bool alreadyObtainedValue=false;
playerOneFake.SetupGet(p => p.Score).Callback(() => {
if(alreadyObtainedValue) {
return realObject.Score;
} else {
alreadyObtainedValue=true;
return 0;
}
});