关于单元测试的思考--Asp.Net Core单元测试最佳实践

发表于:2018-9-29 10:23

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:李玉宝    来源:博客园

  public void ConfigureServices(IServiceCollection services)
  {
  services.AddMvc().AddControllersAsServices().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
  }
  这时即可顺利测试通过。
  测试含有HTTP上下文的业务逻辑,比如Cookie、URL中的QueryString
  在平时的代码过程中,常常会和HTTP上下文HttpContext打交道,最常见的如request、response、cookie、querystring等,比如我们新的逻辑:
  public class UserService
  {
  private IHttpContextAccessor _httpContextAccessor;
  public UserService(IHttpContextAccessor httpContextAccessor)
  {
  _httpContextAccessor = httpContextAccessor;
  }
  public bool IsLogin()
  {
  return _httpContextAccessor.HttpContext.Request.Cookies["username"] != null;
  }
  }
  这时如何测试呢?马丁福勒在他的大作《企业应用架构模式》中明确指出“测试桩”的概念,来应对这种情况。各种Mock框架应运而生。比如我最喜欢的Moq:
  public class TestCookie
  {
  private UserService _service;
  [SetUp]
  public void Init()
  {
  var httpContextAccessorMock = new Mock<IHttpContextAccessor>();
  httpContextAccessorMock.Setup(x => x.HttpContext.Request.Cookies["username"]).Returns("yubaolee");
  var server = new TestServer(WebHost.CreateDefaultBuilder()
  .ConfigureServices(u =>u.AddScoped(x =>httpContextAccessorMock.Object))
  .UseStartup<Startup>());
  _service = server.Host.Services.GetService<UserService>();
  }
  [Test]
  public void TestLogin()
  {
  bool result = _service.IsLogin();
  Assert.IsTrue(result);
  }
  }
  测试一次HTTP请求
  有时我们需要测试Mvc框架的模型绑定,看看一次客户端的请求是否能被正确解析,亦或者测试WebAPI入口的一些Filter AOP等是否被正确触发,这时就需要测试一次HTTP请求。从严格意义上来讲这种测试已经脱离的单元测试的范畴,属于集成测试。但这种测试代码可以节省我们大量的重复劳动。asp.net core中可以通过TestServer快速实现这种模拟:
  public class TestHttpRequest
  {
  private TestServer _testServer;
  [SetUp]
  public void Init()
  {
  _testServer = new TestServer(WebHost.CreateDefaultBuilder().UseStartup<Startup>());
  }
  [Test]
  public void TestLogin()
  {
  var client = _testServer.CreateClient();
  var result = client.GetStringAsync("/api/values/checklogin?name=yubao&password=yubao");
  Console.WriteLine(result.Result);
  }
  }
  在进行单元测试的过程中,测试的理念(或者TDD的思维?)异常重要,它能帮助你构建和谐优美的代码。

   上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。

22/2<12
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号