单元测试之moq

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()才可以通过!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值