You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何在FakeItEasy+NUnit3中为控制器单元测试设置请求URL

使用FakeItEasy + NUnit3 测试Asp.Net Core控制器的Request.Query参数

没问题,我给你写一个适配FakeItEasy和NUnit3的单元测试示例,核心是通过伪造控制器的HttpContextHttpRequest对象,来注入你需要的returnUrl查询参数:

using NUnit.Framework;
using FakeItEasy;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Http;

[TestFixture]
public class LoginControllerTests
{
    private LoginController _loginController;
    private HttpRequest _fakeHttpRequest;

    [SetUp]
    public void TestSetup()
    {
        // 1. 伪造HttpRequest对象
        _fakeHttpRequest = A.Fake<HttpRequest>();

        // 2. 伪造HttpContext,并关联我们的fake HttpRequest
        var fakeHttpContext = A.Fake<HttpContext>();
        A.CallTo(() => fakeHttpContext.Request).Returns(_fakeHttpRequest);

        // 3. 初始化控制器并绑定伪造的HttpContext
        _loginController = new LoginController(); 
        // 如果你的控制器有构造函数依赖,比如ILogger或者服务,用A.Fake<>注入即可,比如:
        // var fakeAuthService = A.Fake<IAuthService>();
        // _loginController = new LoginController(fakeAuthService);

        _loginController.ControllerContext = new ControllerContext
        {
            HttpContext = fakeHttpContext
        };
    }

    [Test]
    public async Task Login_WhenReturnUrlIsProvided_ShouldProcessDecodedUrl()
    {
        // Arrange
        // 准备测试用的returnUrl(可以是编码前或编码后的值,对应控制器里的解码逻辑)
        var encodedReturnUrl = "%2Fuser%2Fprofile";
        var expectedDecodedUrl = "/user/profile";

        // 设置Request.Query的参数集合
        var queryParams = new QueryCollection(new Dictionary<string, StringValues>
        {
            { "returnUrl", encodedReturnUrl }
        });
        A.CallTo(() => _fakeHttpRequest.Query).Returns(queryParams);

        // 构造测试用的LoginViewModel
        var testLoginModel = new LoginViewModel
        {
            Username = "test_user",
            Password = "test_pass123"
            // 填充其他必要属性
        };

        // Act
        var actionResult = await _loginController.Login(testLoginModel);

        // Assert
        // 根据你的控制器实际逻辑编写断言,比如如果控制器会跳转到returnUrl,就验证跳转结果
        var redirectResult = actionResult as RedirectResult;
        Assert.Multiple(() =>
        {
            Assert.That(redirectResult, Is.Not.Null, "Login方法应返回RedirectResult");
            Assert.That(redirectResult.Url, Is.EqualTo(expectedDecodedUrl), "跳转地址应匹配解码后的returnUrl");
        });
    }
}

关键说明:

  • 我们通过A.Fake<HttpRequest>伪造请求对象,再把它挂载到控制器的ControllerContext.HttpContext上,这样控制器内部的Request属性就会指向这个伪造对象。
  • QueryCollection构造查询参数集合,模拟URL里的查询字符串,FakeItEasy会让Request.Query返回这个集合,控制器就能正确获取到returnUrl
  • 如果要测试未编码的URL,直接把encodedReturnUrl换成expectedDecodedUrl即可,控制器里的Uri.UnescapeDataString也能正常处理。
  • 如果控制器有构造函数依赖,记得用FakeItEasy伪造对应的服务并传入控制器构造函数。

内容的提问来源于stack exchange,提问作者mgtb

火山引擎 最新活动