这是我的问题测试:
[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只需要返回0一次-我第一次在PointState中检查它的时候。在这之后,我需要一个非模拟版本来检查断言中的实际分数是否已增加。
我知道您可以通过设置次数进行验证-例如Times.Once(),但是我如何在设置中使用此功能?
有什么想法吗?快把我逼疯了。
干杯。
发布于 2009-11-04 01:53:11
您似乎是在测试Mock对象上属性的返回值,但这并不能证明什么。相反,您应该测试PointState对象是否对IEntity进行了预期的调用(也许设置了Score属性?)调用PointState对象的Enter方法时。
假设它设置了一个Score属性,您将执行如下操作
entity.VerifySet(x => x.Score = 15);发布于 2009-11-04 01:52:01
不使用Returns配置属性,而是使用Callback配置它,并使用第一次返回0,第二次调用真实对象的代码。我从来没有在SetupGet中使用过回调,但它应该是这样的(代码没有经过测试,它只是为了说明这个想法):
bool alreadyObtainedValue=false;
playerOneFake.SetupGet(p => p.Score).Callback(() => {
if(alreadyObtainedValue) {
return realObject.Score;
} else {
alreadyObtainedValue=true;
return 0;
}
});https://stackoverflow.com/questions/1668985
复制相似问题