单元测试与Moq

这个篇幅里面,记录单元测试与Moq模拟包的知识点。

单元测试

每一个模块,都应该有对应的单元测试。单元测试可以保证你的代码准确性,大大减少出现BUG的几率。一个好的单元测试,也是重构代码必不可少的部分。

我们可以直接在vs中,新增单元测试项目。

类库中,只要声明TestClass,就当做是单元测试。

单元测试分为三部分:准备,行为,断言。其中准备和行为,就是模拟程序代码执行。断言,就是判断程序执行结果与预期结果是否一致。

断言使用:Assert类来实现。详细参见:Assert类

[TestClass]
    public class HomeControllerTest
    {
        [TestMethod]
        public void Index()
        {
            // Arrange
            HomeController controller = new HomeController();

            // Act
            ViewResult result = controller.Index() as ViewResult;

            // Assert
            Assert.IsNotNull(result);
        }

        [TestMethod]
        public void About()
        {
            // Arrange
            HomeController controller = new HomeController();

            // Act
            ViewResult result = controller.About() as ViewResult;

            // Assert
            Assert.AreEqual("Your application description page.", result.ViewBag.Message);
        }

        [TestMethod]
        public void Contact()
        {
            // Arrange
            HomeController controller = new HomeController();

            // Act
            ViewResult result = controller.Contact() as ViewResult;

            // Assert
            Assert.IsNotNull(result);
        }

Moq

Moq是针对Net开发的模拟库。他的目标是让模拟以一种自然的方式与现有的单元测试进行集成,使他更加直观。

我们可以使用nuget,来获取Moq包。或者访问其官网,不过被墙了。

局限性

模拟的类不能为密封类。不能直接模拟静态方法。Moq只能创建模拟对象的实例。可以通过模拟的方式让他去访问service,并且根据不同的请求模拟返回响应的结果。

原理

Moq只需要一个接口,就可以产生一个对象。利用反射机制来动态生成一个空框架,用于模仿对象的行为。

Mock

通过Mock<T>这个类,我们就可以创建一个对象的模拟。T可以使接口或者类。但必须有public和virtual属性。

通过IFake接口,去动态创建Mock。然后使用Setup方法去创建我们需要的对象。当模拟的对象调用它自己方法的时候,并且参数是Ping。

最后Return返回对应结果,前面的请求返回结果为真。这是我们指定的返回值。当请求调用DoSomething并且传递Ping,那么就返回true。

 public interface IFake
        {
            bool DoSomething(string actionname);
        }

        [TestMethod]
        public void Test_Interface_IFake()
        {
            var mo = new Mock<IFake>();
            mo.Setup(f => f.DoSomething("Ping")).Returns(true);
            mo.Setup(f => f.DoSomething("PingF")).Returns(false);
            Assert.AreEqual(true, mo.Object.DoSomething("Ping"));
            Assert.AreEqual(false, mo.Object.DoSomething("PingF"));
        }

IT

It是一个静态类,定义了静态方法。可以使用泛型来指定值。

It.IsAny<string> 表示只要传入任何String即可。

It.Is<int>(id=>id>0 && id<6) 表示必须传入0到6的区间,才可以返回。

It.IsIn<string> 表示可以传入的区间。 具体内容可以查看IT的接口

[TestMethod]
        public void User_Can_Send_Password()
        {
            var email = new Mock<IEmailSender>();
            email.Setup(f => f.Send(It.IsAny<string>(), It.Is<string>(id => id != "Chenxy"), It.IsAny<string>())).Returns(true);
            Assert.AreEqual(true, email.Object.Send(It.IsAny<string>(), It.IsAny<string>(), It.IsIn<string>("1", "2", "3")));
        }

 

压力测试工具

HttpTest4Net:http://www.cnblogs.com/smark/p/3636873.html

 

 

 

 

 

 

占位符

转载于:https://www.cnblogs.com/chenxygx/p/5803544.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值