测试

测试含有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);

    }

}
posted @ 2022-12-13 17:34  任锋  阅读(134)  评论(0编辑  收藏  举报