单元测试之moq

来源:互联网 发布:c 语言declaration 编辑:程序博客网 时间:2024/04/28 15:13

moq模拟属性

源代码

public class Customer{    public virtual int a { get; set; }    public virtual string b { get; set; }}

测试代码

    var customer = new Mock<Customer>();    customer.SetupProperty(p => p.a, 5);    customer.Setup(p=>p.a).Returns(3);    Assert.AreEqual(4, customer.Object.a);

注意

customer.SetupProperty(p=>p.a,5);等同于customer.Setup(p=>p.a).Returns(5);

moq模拟方法

代码

    public interface Customer    {         void a();         string b();         string c(ref string cs);         string d(string ds, out string dso);    }

测试代码

            var cs = "i am c";            var dso = "";            var customer = new Mock<Customer>();            customer.Setup(p=>p.a());            customer.Setup(p=>p.b()).Returns("i am b");            customer.Setup(p=>p.c(ref cs)).Returns((string s)=>s);            customer.Setup(p=>p.d("i am d",out dso)).Returns("i am d 2");            customer.Object.a();            Assert.AreEqual("i am b", customer.Object.b());            Assert.AreEqual("i am c", customer.Object.c(ref cs));            Assert.AreEqual("i am d 2", customer.Object.d("i am d", out dso));            Assert.AreEqual("", dso);

moq模拟异常

代码

    public interface Customer    {        void ShowException(int a);    }
测试代码

            var customer = new Moq.Mock<Customer>();            customer.Setup(p => p.ShowException(0)).Throws(new Exception("i a exception"));            customer.Object.ShowException(0);

moq模拟调用时赋值

代码

    public interface Customer    {        void A();    }
测试代码

            var customer = new Moq.Mock<Customer>();            int a = 0;            customer.Setup(p=>p.A()).Callback(()=>a++);            customer.Object.A();            Assert.AreEqual(1,a);

moq模拟参数过滤

代码

    public interface Customer    {        int A(int a);    }
测试代码

            var customer = new Mock<Customer>();            customer.Setup(p=>p.A(It.Is<int>(i=>i%2==0))).Returns(2);                        Assert.AreEqual(2,customer.Object.A(5));

测试代码customer.Setup(p=>p.A(It.Is<int>(i=>i%2==0))).Returns(2);表示当参数是偶数时,返回2

It用于参数约束,常用的约束有

  1. It.IsInRange<T>:表示参数是否在某个范围
  2. It.IsRegex<T>:用正则表达式限制参数
  3. 等等....

moq模拟回调函数

见moq模拟调用时赋值

moq检测功能

代码

    public interface Customer    {        int A(int a);    }
测试代码

            var customer = new Mock<Customer>();            customer.Setup(p=>p.A(It.Is<int>(i=>i%2==0))).Returns(2).Verifiable();            customer.Object.A(4);            customer.Verify();
通过Verifiable()将A()函数标记,只有A()函数被调用,customer.Verify()才可以通过!

原创粉丝点击