如何将Asp.Net Core单元测试最佳实践转化为一个?

摘要:在我们码字过程中,单元测试是必不可少的。但在从业过程中,很多开发者却对单元测试望而却步。有些时候并不是不想写,而是常常会碰到诸如不能模拟一次HTTP请求,不能读取配置文件,测试类的构造参数太多等问题,让开发者放下了码字的脚步。这些问题确实存
在我们码字过程中,单元测试是必不可少的。但在从业过程中,很多开发者却对单元测试望而却步。有些时候并不是不想写,而是常常会碰到下面这些问题,让开发者放下了码字的脚步: 这个类初始数据太麻烦,你看:new MyService(new User("test",1), new MyDAO(new Connection(......)),new ToManyPropsClass(......) .....) 。我:。。。 这个代码内部逻辑都是和Cookie有关,我单元测试不好整啊,还是得启动到浏览器里一个按钮一个按钮点。 这个代码内部读了配置文件,单元测试也不能给我整个配置文件啊? 这个代码主要是验证WebAPI入口得模型绑定,必须得调用一次啊? 这些问题确实存在,但它们阻止不了我们那颗要写单元测试的心。单元测试的优点很多,你或许可以不管。但至少能让你从那些需要在浏览器里点击10多下的操作里解脱出来。本文从一个简单的逻辑测试出发,慢慢拉开测试的大幕,让你爱上测试。文章主要是传播一些单元测试的理念,其次才是介绍asp.net core中的单元测试。 本文使用的环境为asp.net core 2.1 webapi,代码可以直接下载:https://github.com/yubaolee/DotNetCoreUnitTestSamples 为了方便阅读,以一个最简单的逻辑为例: public class UserService{ public bool CheckLogin(UserInfo user) { return user.Name == user.Password; //登录逻辑,为了看着舒服,少点 } } public class UserInfo{ public string Name { get; set; } public string Password { get; set; } } 测试的WebAPI控制器如下: public class ValuesController : ControllerBase { private UserService _service; public ValuesController(UserService service) { _service = service; } [HttpGet] [Route("checklogin")] public bool CheckLogin([FromQuery]UserInfo user) { return _service.CheckLogin(user); } } 都已准备完毕,那么,开始我们的表演吧: 普通业务的单元测试 public class TestService { private UserService _service; [SetUp] public void Init() { var server = new TestServer(WebHost.CreateDefaultBuilder().UseStartup<Startup>()); _service = server.Host.Services.GetService<UserService>(); } [Test] public void TestLogin() { bool result = _service.CheckLogin(new UserInfo { Name = "yubao", Password = "yubao" }); Assert.IsTrue(result); } } 在做业务测试过程中要善于使用注入功能,而不是使用new对象的方式,比如这里的Host.Services.GetService,防止出现new MyService(new User("test",1), new MyDAO(new Connection(......)),new ToManyPropsClass(......) .....)这种尴尬。
阅读全文