前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Moq基础 判断方法被执行

Moq基础 判断方法被执行

作者头像
林德熙
发布2019-03-13 11:32:11
1.4K0
发布2019-03-13 11:32:11
举报
文章被收录于专栏:林德熙的博客

本文是在Moq基础(五)的基础上做的补充

例如有方法 Foo 支持注入接口 IFoo 需要判断在 Foo 方法里面调用 IFoo 的 Foo 方法几次

代码语言:javascript
复制
   public class Foo
    {
        /// <inheritdoc />
        public Foo(IFoo foo)
        {
            _foo = foo;
        }

        public void A()
        {
            _foo.Foo();
        }

        private readonly IFoo _foo;
    }

    public interface IFoo
    {
        void Foo();
    }

此时就可以通过先做一个虚拟的方法

代码语言:javascript
复制
                    var mock = new Mock<IFoo>();
                    var foo = new Foo(mock.Object);
                    // 创建一个虚拟方法
                    mock.Setup(fake => fake.Foo());

然后调用 foo 的需要被测试方法

代码语言:javascript
复制
                    foo.A();

接着判断这个 IFoo 的 Foo 被调用多少次

代码语言:javascript
复制
                    // 判断在调用 A 之后调用了 IFoo 的 Foo 方法多少次
                    mock.Verify(fake => fake.Foo(), Times.Once);

这是整个测试方法的代码

代码语言:javascript
复制
    [TestClass]
    public class FT
    {
        [ContractTestCase]
        public void A()
        {
            "调用 Foo 的 A 方法时会调用 IFoo 的 Foo 方法一次".Test(() =>
            {
                // Arrange

                var mock = new Mock<IFoo>();
                var foo = new Foo(mock.Object);
                // 创建一个虚拟方法
                mock.Setup(fake => fake.Foo());

                // Action

                foo.A();
                foo.A();

                // Assert

                // 判断在调用 A 之后调用了 IFoo 的 Foo 方法多少次
                mock.Verify(fake => fake.Foo(), Times.Once);
            });
        }
    }

如果觉得上面的代码写的不错,可以清晰看到每个测试方法,而不是去写小伙伴都看不懂的英文,那么请让使用 MSTestEnhancer 这个测试框架的使用方法十分简单,具体请看MSTestEnhancer 的使用

使用了之后就可以在运行单元测试的时候看到有哪些方法可以运行,有哪些不通过

下面将会详细告诉大家如何使用方法验证

在 Mock 可以通过 Setup 做出虚拟的方法,为什么需要在 Setup 方法里面再次调用需要被虚拟的方法?因为在 Setup 里面调用的时候,实际是说构造出哪些方法是虚拟的方法

对于不需要被调用的方法就不会在 Setup 构造,这样如果发现被测试的类调用了没有被虚拟的方法,那么证明这个被测试的类有坑

另外在做出虚拟的方法的时候,还可以要求传入参数,在传入参数的时候实际就是对传入的参数做出验证。这里请看Moq基础(五) 参数匹配,回调,和验证 里面有详细说到。

那么在实际运行被测试类的方法之后,就可以通过 Verify 判断某个方法被调用了多少次

代码语言:javascript
复制
mock.Verify(fake => fake.虚拟的方法, 被调用多少次);

这里的被调用多少次是可以是 Times 属性,这个属性有下面的取值

  • Once 方法只是被调用一次
  • AtLeast 至少多少次,这个方法可以传入参数
  • AtLeastOnce 至少一次
  • AtMost 最多多少次,这个方法可以传入参数
  • AtMostOnce 最多一次
  • Between 在 xx 到 xx 中间,这个方法可以传入参数
  • Exactly 刚好被调用多少次,这个方法可以传入参数
  • Never 没有被使用

通过这个方法就可以判断一个方法被多少次调用,需要注意,在 Verify 里面需要调用被虚拟的方法是用来做参数判断的,可以判断传入了某个参数的方法调使用多少次的方法

如果不满足就会在 Verify 方法抛出 MockException 在里面会说到要求的是什么,但是实际调用的是什么


本文会经常更新,请阅读原文: https://lindexi.gitee.io/post/Moq%E5%9F%BA%E7%A1%80-%E5%88%A4%E6%96%AD%E6%96%B9%E6%B3%95%E8%A2%AB%E6%89%A7%E8%A1%8C.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

知识共享许可协议
知识共享许可协议

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接: https://lindexi.gitee.io ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档