【发布时间】: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