2017-09-26 59 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

你,你已經測試與單元測試隔離屬性,按理說,它會像預期的那樣在集成和生產提供的測試覆蓋預期的行爲

相關問題