【问题标题】:Integration Testing with .NET Core and NUnit使用 .NET Core 和 NUnit 进行集成测试
【发布时间】:2017-04-12 10:45:59
【问题描述】:

我有一个控制器正在接受 JWT 声明,如果声明正确,那么我将返回一个 Json 类别字符串,如下所示:-

[Authorize(Policy = "OnlyValidUsers")]
[Route("api/[controller]")]
public class CategoriesController : Controller
{
    private readonly IGenericService<Category> _categoriesService;

    public CategoriesController(IGenericService<Category> categoriesService)
    {
        _categoriesService = categoriesService;
    }

    [Authorize(Policy = "GenericUser")]
    [HttpGet("/api/Categories/Get", Name = "GetCategories")]
    public async Task<IActionResult> Get()
    {
        var categories = await _categoriesService.GetAll();
        return Json(categories);
    }
}

这发生在用户登录我的系统并获得不记名令牌之后。

我正在尝试在集成测试中进行如下测试:-

[TestFixture]
public class CategoriesControllerIntegrationTests
{
    private HttpClient _client;
    private Category _testCategory;
    private string _request;

    [SetUp]
    public void Setup()
    {
        var basePath = PlatformServices.Default.Application.ApplicationBasePath;
        var projectPath = Path.GetFullPath(Path.Combine(basePath, "../../../../SportsStore.Tests"));

        var server = new TestServer(Utils.GetHostBuilder(new string[] { })
            .UseContentRoot(projectPath)
            .UseEnvironment("Development")
            .UseStartup<Startup>());

        _client = server.CreateClient();
        _testCategory = new Category
        {
            Name = Enums.GetEnumDescription(Enums.CategoryTestData.Name)
        };
        _request = Enums.GetEnumDescription(Enums.Requests.Categories);
    }

    [Test]
    public async Task Get_ReturnsAListOfCategories_CategoriesController()
    {
        var response = await _client.GetAsync(_request + "Get");
        response.EnsureSuccessStatusCode();

        Assert.IsTrue(true);
    }

Utils类如下:-

public class Utils
{
    public static IWebHostBuilder GetHostBuilder(string[] args)
    {
        var config = new ConfigurationBuilder()
                   .AddCommandLine(args)
                   .AddEnvironmentVariables(prefix: "ASPNETCORE_")
                   .Build();

        return new WebHostBuilder()
            .UseConfiguration(config)
            .UseKestrel()
            .UseStartup<Startup>();
    }
}

当我运行测试时,我得到了预期的 401(未经授权)。我怎样才能使这个测试通过?如何在测试中通过声明以验证其是否有效?

另外,如果我删除 [Authorize] 过滤器,我仍然会收到我认为不应该发生的 401(未授权)。

任何帮助将不胜感激!

谢谢

【问题讨论】:

  • 您是否删除了两个Authrize 过滤器,因为我看到了其中的两个(并且您是否指定了更多作为全局过滤器)?要么通过提供正确的 cookie 状态(例如首先登录)确保你通过测试通过授权属性,要么在策略中进行覆盖(但这可能会让你以后容易受到攻击)。
  • 我之前确实删除了它们只是为了检查这些是否是原因,但是当我删除它们时,我仍然得到 401,这就是为什么我怀疑我在设置中有问题。 cs 或 TestServer
  • 确认问题出在这个 services.AddMvc(config => { var policy = new AuthorizationPolicyBuilder() .RequireAuthenticatedUser() .Build(); config.Filters.Add(new AuthorizeFilter(policy)) ; });
  • 我需要找到一种方法来通过我的测试通过策略,但到目前为止不知道该怎么做
  • 我建议使用不同的 Startup.cs 进行测试并执行不同的 AddMvc。或者通过解析 SignInManager 等让您的单元测试首次登录。不要使用 if else 更改您的默认 startup.cs,这只会导致安全风险

标签: testing asp.net-core nunit integration-testing .net-core


【解决方案1】:

您可以为http客户端的每个请求添加Authorization标头:

_client = server.CreateClient();
_client .DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "VALID JWT goes here");

这样你就不需要为测试和真实环境单独配置了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-03
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    相关资源
    最近更新 更多