ASP.NET Core - UnitTest

在 ASP.NET Core 上进行单元测试

首先我们先添加一个项目

用于进行基于 xUnit 的测试

xUnit 和 传统的测试的区别在于:

....

 

之后我们先来测试控制器

我们创建一个跟控制器同名带 Test 结尾的类

using Xunit;
public class CategoryControllerTest
{
}

之后在这个类中

填写对应的 Action 的测试方法

[Fact]
public void GetTest()
{
    //Arrange
    var options = new DbContextOptionsBuilder<SchoolDbContext>()
        .UseInMemoryDatabase(databaseName: "MyDb1")
        .Options;
    CategoryInit.Init(options);
    var queryInput = new QueryInputModel();
    var pageInput = new PagingInputModel();

    using (var context = new SchoolDbContext(options))
    {
        // Act
        var controller = new CategoryController(context);
        var result = controller.Get(queryInput, pageInput);

        // Assert
        Assert.NotNull(result);
    }
}

 这里采用了 3A 测试结构

所谓的 3A 指的是

Arrange: 准备测试环境, 就是实例化一些测试用例什么的

Act:测试用调用方法, 就是调用测试目标

Assert:断言, 就是判断测试是否出错

 

值得注意的是

一般来说我们的 Mvc 都是用依赖注入的方式去传递对象的

但是这里测试的话, 目前来说我更倾向于自己创建实例化的方法

对 DbContext 来说, 可以创建一个内存数据库去模拟假的数据

能更好的模拟生产情况下的数据库表现

 

另外还有一点原则就是, 不要在一个方法里面去测试多个行为

Controller.Action 本身来说只是接受参数, 然后执行了方法之后返回一个视图

这里测试不需要关心执行了什么方法, 而是只要能接收到正确的视图即可

更详细的业务测试可以另外新建一个专门去测试业务层

这里为了方便都合在一起了, 严格来说这样是不规范的

 

另外要值得注意

针对异步控制器的测试好像还存在一些问题, 这里最好再仔细研究下, 

 

posted @ 2018-06-14 16:09  `Laimic  阅读(210)  评论(0)    收藏  举报