webapi项目的XUnitTest单元测试怎么注入token和自写拦截器(filter)(语言-c#)

问题遇到的现象和发生背景

webapi项目的XUnitTest单元测试怎么注入token和filter

遇到的现象和发生背景,请写出第一个错误信息

有一个webapi项目,使用的Furion框架,反正就是一个WebApi框架,现在新增了一个XUnitTest项目,现在项目Service层里用了应用程序上下文,是在验证token成功后通过自写的拦截器写入到上下文的,但是在XUnitTest启动里获取不到上下文,代码也不进自写的拦截器,token也不知道该怎么注入,想请问各位同事们,有没有啥解决方案或者案例

用代码块功能插入代码,请勿粘贴截图。 不用代码块回答率下降 50%
运行结果及详细报错内容
我的解答思路和尝试过的方法,不写自己思路的,回答率下降 60%
我想要达到的结果,如果你需要快速回答,请尝试 “付费悬赏”

因为XUnitTest项目不会执行拦截器中的代码,所以你可以在XUnitTest测试用例中,自己维护一个token,然后在Service层开始(比如controller中的Action)的时候,自己把token赋值给你的应用程序上下文即可。
具体的做法
你可以在XUnitTest中手动构建一个token,把它赋值给你的应用程序上下文,然后在不同的测试场景中,让这个token有不同的值,比如有效和无效,然后再来测试服务层是否能正确处理不同状态下的token。

最简单的解决方案是在XUnitTest项目里使用和WebApi项目一样的拦截器,注入token并写入到应用程序上下文中,以便在Service层里获取到token信息。另外,也可以在XUnitTest项目里使用模拟数据,不使用拦截器和应用程序上下文,这样就不需要写入token和处理token的逻辑了。

下面是一个 XUnitTest 中设置应用程序上下文并模拟 token 验证的代码案例:


[TestClass]
public class YourTestClass
{
    private YourService _service;
    private YourApplicationContext _context;
    
    [TestInitialize]
    public void TestInitialize()
    {
        // 初始化模拟的应用程序上下文
        _context = new YourApplicationContext
        {
            Token = "your-token"
        };
        
        // 初始化服务层
        _service = new YourService(_context);
    }
    
    [TestMethod]
    public void TestMethod()
    {
        // 调用服务层中的方法
        var result = _service.YourMethod();
        
        // 断言结果
        Assert.IsTrue(result);
    }
}


此代码案例假设你的服务层是这样的:


public class YourService
{
    private YourApplicationContext _context;
    
    public YourService(YourApplicationContext context)
    {
        _context = context;
    }
    
    public bool YourMethod()
    {
        // 在这里使用 _context.Token
        return true;
    }
}

提供参考方法,链接:https://www.cnblogs.com/zengwei/p/11104301.html

该回答引用ChatGPT
请参考下面的解决方案,如果有帮助,还请点击 “采纳” 感谢支持!

这是一个使用依赖注入注入模拟token的示例:
首先,在Service层中,您可以定义一个ITokenService接口,该接口具有获取token的方法:

public interface ITokenService
{
    string GetToken();
}

然后,您可以定义一个TokenService实现该接口,并在其中实现真实的token验证过程:

public class TokenService : ITokenService
{
    public string GetToken()
    {
        // 这里是实际的token验证过程
        return "real-token";
    }
}

接下来,您可以在XUnitTest项目中定义一个MockTokenService类,该类实现ITokenService接口,并返回模拟token:


public class MockTokenService : ITokenService
{
    public string GetToken()
    {
        return "mock-token";
    }
}

最后,在单元测试代码中,您可以使用依赖注入,将MockTokenService注入到需要使用token的代码中:

[Fact]
public void TestMethod1()
{
    var tokenService = new MockTokenService();
    // 将tokenService注入到需要使用token的代码中
    var result = SomeCodeThatUsesToken(tokenService);
    // 测试结果
    Assert.Equal("expected-result", result);
}

这样,在单元测试中就可以使用模拟的token,而不必真实的验证token。

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^