2017-09-26 56 views
2

我的项目是一个ASP.NET Core 2.0 Web应用程序。如何使用asp.net core 2测试具有属性的方法?

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

例如:

属性

[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,但我也想测试它的控制器方法。

+1

这将需要进行集成测试,您可以在其中发送实际请求(内存中测试服务器或运行站点),然后验证预期行为https://docs.microsoft.com/en-us/aspnet/core/testing/integration-testing – Nkosi

+2

更好地测试方法并单独测试属性。 – DavidG

回答

1

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

参考Integration testing in ASP.NET Core

你,你已经测试与单元测试隔离属性,按理说,它会像预期的那样在集成和生产提供的测试覆盖预期的行为

相关问题