.NET使用Moq进行单元测试

2022-08-13 18:52:40

本篇体验Moq的一些基本用法。首先通过NuGet安装Moq。

模拟方法的返回值

    public class HelperClass
    {
        public virtual Boolean IsEnabled()
        {
            throw new Exception();
        }
    }
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
            var mock = new Mock<HelperClass>();
            mock.Setup(x => x.IsEnabled()).Returns(true);
            Assert.AreEqual(mock.Object.IsEnabled(),true);
        }
    }
    Moq模拟的方法一般是virtual虚方法,接口方法mock.Object是指HelperClass的实例

    模拟方法后执行回调函数

       [TestClass]
        public class UnitTest1
        {
            [TestMethod]
            public void TestMethod1()
            {
                string temp = "";
                var mock = new Mock<HelperClass>();
                mock.Setup(x => x.IsEnabled()).Returns(true).Callback(() => { temp = "success"; });
                Assert.AreEqual(mock.Object.IsEnabled(),true);
                if (temp == "success")
                {
                    //TODO
                }
            }
        }
      执行Return方法后,执行Callback回调方法,接收的参数类型是委托

      模拟方法依次返回多个值

          [TestClass]
          public class UnitTest1
          {
              [TestMethod]
              public void TestMethod1()
              {
                  var mock = new Mock<HelperClass>();
                  mock.SetupSequence(x => x.IsEnabled())
                      .Returns(true)
                      .Returns(false);
                  
                  Assert.AreEqual(mock.Object.IsEnabled(),true);
                  Assert.AreEqual(mock.Object.IsEnabled(), false);
              }
          }
        SetupSequence方法可以为方法返回多个值

        如果把以下2句:

        Assert.AreEqual(mock.Object.IsEnabled(),true);
        Assert.AreEqual(mock.Object.IsEnabled(), false);

        颠倒一下顺序,变成:

        Assert.AreEqual(mock.Object.IsEnabled(), false);
        Assert.AreEqual(mock.Object.IsEnabled(),true);

        结果,测试不通过。因为SutupSequence返回方法返回值的时候是有顺序的。

        模拟第二次调用方法返回异常

            [TestClass]
            public class UnitTest1
            {
                [TestMethod]
                public void TestMethod1()
                {
                    var mock = new Mock<HelperClass>();
                    mock.SetupSequence(x => x.IsEnabled())
                        .Returns(true)
                        .Throws(new Exception());
                    
                    Assert.AreEqual(mock.Object.IsEnabled(),true);
                    Assert.AreEqual(mock.Object.IsEnabled(), true);
                }
            }
          通过Throws方法,在第二次调用IsEnable()方法时抛出异常。

          直接返回被模拟方法的原始返回值

              public class HelperClass
              {
                  public virtual Boolean IsEnabled()
                  {
                      throw new Exception();
                  }
              }
              [TestClass]
              public class UnitTest1
              {
                  [TestMethod]
                  public void TestMethod1()
                  {
                      var mock = new Mock<HelperClass>();
                      mock.CallBase = true;
                      mock.SetupSequence(x => x.IsEnabled())
                          .CallBase();
                      Assert.AreEqual(mock.Object.IsEnabled(), true);
                  }
              }

          在被模拟的HelperClass类中,IsEnabled方法内部抛出异常。当把Moq实例的CallBase属性设置为true,并调用CallBase方法,可在测试方法中直接返回被模拟类中方法的原始返回值。

          模拟泛型类

              public class HelperClass<T> where T : class 
              {
                  public virtual Boolean IsEnabled()
                  {
                      throw new Exception();
                  }
              }
              public class Sample{}
              [TestClass]
              public class UnitTest1
              {
                  [TestMethod]
                  public void TestMethod1()
                  {
                      var mock = new Mock<HelperClass<Sample>>();
                      mock.SetupSequence(x => x.IsEnabled()).Returns(true);
                      Assert.AreEqual(mock.Object.IsEnabled(), true);
                  }
              } 

          到此这篇关于.NET使用Moq进行单元测试的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持易采站长站。