如何测试具有 asp.net 核心 2 属性的方法?

How to test methods with attributes with asp.net core 2?

我的项目是 ASP.NET Core 2.0 网络应用程序。

如何通过调用包含该属性的方法来测试我自己编写的属性是否正常工作?

例如:

属性

[AttributeUsage(AttributeTargets.Method)]
public class ValidateUserLoggedInAttribute : ActionFilterAttribute
{
  public override void OnActionExecuting(ActionExecutingContext context)
  {
     var controller = (BaseController)context.Controller;
     if (!controller.UserRepository.IsUserLoggedIn)
     {
        var routeValueForLogin = new RouteValueDictionary(new { action = "Login", controller = "Home", area = "" });
        context.Result = new RedirectToRouteResult(routeValueForLogin);
     }
  }
}

控制器:

[ValidateUserLoggedIn]
public IActionResult Start()
{
    ...
}

测试:

[TestMethod]
public void Test()
{
    // Act
    var result = this.controllerUnderTest.Start() as RedirectToRouteResult;

    // Assert
     Assert.IsNotNull(result);
     Assert.IsFalse(result.Permanent);

     var routeValues = result.RouteValues;

     const string ControllerKey = "controller";
     Assert.IsTrue(routeValues.ContainsKey(ControllerKey));
     Assert.AreEqual("Home", routeValues[ControllerKey]);

     const string ActionKey = "action";
     Assert.IsTrue(routeValues.ContainsKey(ActionKey));
     Assert.AreEqual("Login", routeValues[ActionKey]);
}

我已经通过创建一个 ActionExecutingContext 只为属性编写了一个测试,但我还想为控制器方法测试它。

这将需要一个集成测试,您可以在其中使用内存测试服务器或 运行 站点发送实际请求,然后验证预期行为。

参考Integration testing in ASP.NET Core

您已经通过单元测试单独测试了该属性,如果测试涵盖了预期的行为,那么它在集成和生产中的行为将按预期进行,这是理所当然的