首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MOQ -使moq只有效一次

MOQ -使moq只有效一次
EN

Stack Overflow用户
提问于 2009-11-04 01:42:48
回答 2查看 848关注 0票数 2

这是我的问题测试:

代码语言:javascript
复制
    [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(),但是我如何在设置中使用此功能?

有什么想法吗?快把我逼疯了。

干杯。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-11-04 01:53:11

您似乎是在测试Mock对象上属性的返回值,但这并不能证明什么。相反,您应该测试PointState对象是否对IEntity进行了预期的调用(也许设置了Score属性?)调用PointState对象的Enter方法时。

假设它设置了一个Score属性,您将执行如下操作

代码语言:javascript
复制
entity.VerifySet(x => x.Score = 15);
票数 6
EN

Stack Overflow用户

发布于 2009-11-04 01:52:01

不使用Returns配置属性,而是使用Callback配置它,并使用第一次返回0,第二次调用真实对象的代码。我从来没有在SetupGet中使用过回调,但它应该是这样的(代码没有经过测试,它只是为了说明这个想法):

代码语言:javascript
复制
bool alreadyObtainedValue=false;

playerOneFake.SetupGet(p => p.Score).Callback(() => {
  if(alreadyObtainedValue) {
    return realObject.Score;
  } else {
    alreadyObtainedValue=true;
    return 0;
  }
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1668985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档