这可能只是需要另一双眼睛的情况.我必须遗漏一些东西,但我无法弄清楚为什么这种东西无法测试.我基本上试图通过使用[Authorize]属性标记控制器来确保未经身份验证的用户无法访问视图,并且我尝试使用以下代码对此进行测试:
[Fact]
public void ShouldRedirectToLoginForUnauthenticatedUsers()
{
var mockControllerContext = new Mock<ControllerContext>()
{ DefaultValue = DefaultValue.Mock };
var controller = new MyAdminController()
{ControllerContext = mockControllerContext.Object};
mockControllerContext.Setup(c =>
c.HttpContext.Request.IsAuthenticated).Returns(false);
var result = controller.Index();
Assert.IsAssignableFrom<RedirectResult>(result);
}
Run Code Online (Sandbox Code Playgroud)
我正在寻找的RedirectResult是某种指示用户被重定向到登录表单,但总是返回一个ViewResult,并且在调试时我可以看到即使用户是,也成功命中了Index()方法未经过身份验证.
难道我做错了什么?测试在错误的水平?我是否应该在路线级别测试此类事情?
我知道[Authorize]属性正在运行,因为当我启动页面时,登录屏幕确实被强加给了我 - 但我如何在测试中验证这一点?
控制器和索引方法非常简单,以便我可以验证行为.我把它们包括在内是为了完整性:
[Authorize]
public class MyAdminController : Controller
{
public ActionResult Index()
{
return View();
}
}
Run Code Online (Sandbox Code Playgroud)
任何帮助赞赏...
我的应用程序是一个 ASP.NET Core 1.0 Web API。
我想用TestServer对象测试我的控制器。
我有一个用Authorize属性装饰的控制器类。
我如何获得我的测试客户端:
protected HttpClient GetTestClient(){
var builder =
new WebHostBuilder().UseContentRoot(this.path)
.UseStartup<Startup>()
.UseEnvironment("Development")
.ConfigureServices(services => services.AddTransient<IAnInterface, AMock>());
var server = new TestServer(builder);
var client = server.CreateClient();
return client;
}
Run Code Online (Sandbox Code Playgroud)
我如何使用它的片段:
[TestMethod]
public void ShouldReturnSuccessful()
{
var response = await this.client.PostAsync(Url, content);
response.EnsureSuccessStatusCode();
}
Run Code Online (Sandbox Code Playgroud)
如果我Authorize从控制器类中删除该属性,我的所有测试都可以正常工作,但是如果Authorize设置了该属性,我就会明白System.Net.Http.HttpRequestException: Response status code does not indicate success: 401 (Unauthorized).
这是有道理的。
现在我知道我可以Bearer Token从请求TestServer并执行以下操作:
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "My …Run Code Online (Sandbox Code Playgroud) .net-security authorize-attribute oauth-2.0 asp.net-web-api asp.net-core