我有一个控制器正在接收 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 状态(例如首先登录)传递授权属性,要么在策略中进行覆盖(但这可能会使您以后容易受到攻击)。 - Joel Harkes