加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 嵌套的Moq验证

发布时间:2020-12-15 05:36:54 所属栏目:百科 来源:网络整理
导读:我想在最后几个小时弄清楚这个Moq体操.我有以下几个类 – 我正在尝试做一个简单的验证而且它失败了 – 我似乎无法弄清楚为什么. 注意在Moq设置期间,我在请求BeginCounter时返回Mock.Of – 但是当我尝试验证它时它失败了.但是,如果我取消注释行.Setup(e = e.B
我想在最后几个小时弄清楚这个Moq体操.我有以下几个类 – 我正在尝试做一个简单的验证而且它失败了 – 我似乎无法弄清楚为什么.

注意在Moq设置期间,我在请求BeginCounter时返回Mock.Of – 但是当我尝试验证它时它失败了.但是,如果我取消注释行.Setup(e => e.BeginCounter.Increment()),则验证有效.

我错过了什么?

public interface IPerformanceCounters
{
    void Increment();
    void Decrement();
}

public interface IContext
{
    IPerformanceCounters BeginCounter { get; }
}

public class Test
{
    private readonly IContext context;
    public Test(IContext context) { this.context = context; }
    public void React() { this.context.BeginCounter.Increment(); }
}

void Test()
{
    // ARRANGE
    var p = new Mock<IContext>();
    p.Setup(e => e.BeginCounter).Returns(() => Mock.Of<IPerformanceCounters>());  // This does not work
    // p.Setup(e => e.BeginCounter.Increment()); // However,this works!

    // ACT
    var test = new Test(p.Object);
    test.React();

    // ASSERT
    p.Verify(v => v.BeginCounter.Increment(),Times.Once());
}

解决方法

我认为这是因为非设置方法无法验证.

据我所知,你正在返回一个模拟,然后尝试验证它.但是,在取消注释设置之前,它不会准备好.

void Test()
{
    // ARRANGE
    var p = new Mock<IContext>();
    var perfCountMock = new Mock<IPerformanceCounters>();
    p.Setup(e => e.BeginCounter).Returns(() => perfCountMock.Object);  // This does not work
    perfCountMock.Setup(e => e.Increment());

    // ACT
    var test = new Test(p.Object);
    test.React();

    // ASSERT
    perfCountMock.Verify(v => v.Increment(),Times.Once());
}

以上就是你真正在做的事情.您没有验证IContext调用,而是验证IPerformanceCounters调用.我会这样设置,以便更容易理解,但你可以很容易地取消注释

如果你想保持原样,你需要更好地理解Mock.Of功能.

void Test()
{
        // ARRANGE
        var p = new Mock<IContext>();
        var mockOfPerf = Mock.Of<IPerformanceCounters>();
        p.Setup(e => e.BeginCounter).Returns(mockOfPerf);  // This does not work

        // ACT
        var test = new Test1(p.Object);
        test.React();

                    // ASSERT
        Mock.Get(mockOfPerf).Verify(v=>v.Increment(),Times.Once());
}

这与上面的相同,只是使用Mock.Of的预期功能.您无法验证嵌套的模拟,您需要验证实际的模拟

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读