zoukankan      html  css  js  c++  java
  • 使用Moq来Mock多个接口

       假设您已对Moq已经有所了解,我们经常会遇到多个Interface,在这个情况下我们如何去Mock它们呢,看下面的示例:
    定义下如下的Interface:

       1:      public interface IFirstInterface
       2:      {
       3:         int SomeMethodOnFirstInterface();
       4:      }
       5:   
       6:      public interface ISecondInterface
       7:      {
       8:          int SomeMethodOnSecondInterface();
       9:       
      10:      }
      11:   
      12:      public interface SomeClassImplementingInterfaces : IFirstInterface, ISecondInterface
      13:      {
      14:   
      15:      }

    然后定义一个Generic方法实现两个Interface 特别的方法相加,返回结果:

     
       1:      public class SomeClass
       2:      {
       3:          public static int MultipleInterfaceUser<T>(T x)
       4:              where T : IFirstInterface, ISecondInterface
       5:          {
       6:              IFirstInterface f = (IFirstInterface)x;
       7:              ISecondInterface s = (ISecondInterface)x;
       8:   
       9:              return f.SomeMethodOnFirstInterface() + s.SomeMethodOnSecondInterface();
      10:          }
      11:      }

    让我们来看如何Mock它们:

       1:          [Test]
       2:          public void MultipleInterfaceTest()
       3:          {
       4:              Mock<SomeClassImplementingInterfaces> c =
       5:                  new Mock<SomeClassImplementingInterfaces>();
       6:   
       7:              Mock<IFirstInterface> firstMock = c.As<IFirstInterface>();
       8:              firstMock.Setup(m => m.SomeMethodOnFirstInterface())
       9:                  .Returns(2);
      10:   
      11:              Mock<ISecondInterface> secondMock = firstMock.As<ISecondInterface>();
      12:              secondMock.Setup(m => m.SomeMethodOnSecondInterface())
      13:                  .Returns(4);
      14:   
      15:              int returnValue =
      16:                  SomeClass.MultipleInterfaceUser<SomeClassImplementingInterfaces>(c.Object);
      17:   
      18:              Assert.That(returnValue, Is.EqualTo(6));
      19:          }

    注意这里使用As方法,增加一个指定的Interface到Mock.下面这个方法也可以Pass:

       1:          [Test]
       2:          public void MultipleInterfaceTest2()
       3:          {
       4:              Mock<SomeClassImplementingInterfaces> c =
       5:                  new Mock<SomeClassImplementingInterfaces>();
       6:   
       7:              c.Setup(m => m.SomeMethodOnFirstInterface()).Returns(2);
       8:              c.Setup(m => m.SomeMethodOnSecondInterface()).Returns(4);
       9:   
      10:              int returnValue =
      11:                  SomeClass.MultipleInterfaceUser<SomeClassImplementingInterfaces>(c.Object);
      12:   
      13:              Assert.That(returnValue, Is.EqualTo(6));
      14:          }

    您可以下载Moq,NUnit测试以上代码.Moq框架对UnitTest,TDD有着极大的意义,在后面有时间会介绍更多.希望对您有帮助.


    作者:Petter Liu
    出处:http://www.cnblogs.com/wintersun/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    该文章也同时发布在我的独立博客中-Petter Liu Blog

  • 相关阅读:
    解决使用gomod后goland导包报红问题
    Golang写文件的坑
    Golang去除字符串前后空格
    Golang通过结构体解析和封装XML
    Golang获取CPU、内存、硬盘使用率
    Golang数组和切片的区别
    Golang修改操作系统时间
    Golang中GBK和UTF8编码格式互转
    Golang中的各种时间操作
    Golang十六进制字符串和byte数组互转
  • 原文地址:https://www.cnblogs.com/wintersun/p/1818092.html
Copyright © 2011-2022 走看看