2016-04-14 14 views
6

私は、次のフィルタをテストしようとしています:MoqでActionExecutingContextをモックする方法は?

using Microsoft.AspNet.Mvc; 
using Microsoft.AspNet.Mvc.Filters; 

namespace Hello 
{ 
    public class ValidationFilter : ActionFilterAttribute 
    { 
     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      if (!filterContext.ModelState.IsValid) { 
       filterContext.Result = new BadRequestObjectResult(filterContext.ModelState); 
      } 
     } 
    } 
} 

私は部品番号を使用してActionFilterAttributeを模擬しようとしています。

var context = new ActionExecutingContext(
        new ActionContext(Mock.Of<HttpContext>(), new RouteData(), new ActionDescriptor()), 
        new IFilterMetadata[] { filter, }, 
        new Dictionary<string, object>(), 
        controller: new object()); 

をしかし、私はにModelStateをオーバーライドすることができませんでした:

私は、MVC 6.0.0-RC1に

私の最初の試みを使用しています。それは読み取り専用になりそうだ。

var contextMock = new Mock<ActionExecutingContext>(
        new ActionContext(Mock.Of<HttpContext>(), new RouteData(), new ActionDescriptor()), 
        new IFilterMetadata[] { filter, }, 
        new Dictionary<string, object>()); 

をしかし、私はfilter.OnActionExecuting(contextMock.Object)を呼び出すときに、私は次のエラーを取得する:https://github.com/aspnet/Mvc/blob/6.0.0-rc1/src/Microsoft.AspNet.Mvc.Abstractions/ActionContext.cs#L25

それから私が試した

Castle.DynamicProxy.InvalidProxyConstructorArgumentsException : Can not instantiate proxy of class: Microsoft.AspNet.Mvc.Filters.ActionExecutingContext. 
     Could not find a constructor that would match given arguments: 
     Microsoft.AspNet.Mvc.ActionContext 
     Microsoft.AspNet.Mvc.Filters.IFilterMetadata[] 
     System.Collections.Generic.Dictionary`2[System.String,System.Object] 

にModelStateを使用してフィルタをテストする方法は?

答えて

9

私はちょうど同じ問題に遭遇し、このように解決しました。

[Fact] 
public void ValidateModelAttributes_SetsResultToBadRequest_IfModelIsInvalid() 
{ 
    var validationFilter = new ValidationFilter(); 
    var modelState = new ModelStateDictionary(); 
    modelState.AddModelError("name", "invalid"); 

    var actionContext = new ActionContext(
     new Mock<HttpContext>().Object, 
     new Mock<RouteData>().Object, 
     new Mock<ActionDescriptor>().Object, 
     modelState 
    ); 

    var actionExecutingContext = new ActionExecutingContext(
     actionContext, 
     new List<IFilterMetadata>(), 
     new Dictionary<string, object>(), 
     new Mock<Controller>().Object 
    ); 

    validatationFilter.OnActionExecuting(actionExecutingContext); 

    Assert.IsType<BadRequestObjectResult>(actionExecutingContext.Result); 
} 
関連する問題