yok*_*zor 15 asp.net-mvc unit-testing moq xunit
我正在尝试测试以下过滤器:
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);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我试图使用Moq模拟ActionFilterAttribute.
我使用的是Mvc 6.0.0-rc1
我的第一次尝试:
var context = new ActionExecutingContext(
new ActionContext(Mock.Of<HttpContext>(), new RouteData(), new ActionDescriptor()),
new IFilterMetadata[] { filter, },
new Dictionary<string, object>(),
controller: new object());
Run Code Online (Sandbox Code Playgroud)
但我无法覆盖ModelState.它看起来只是readonly:https://github.com/aspnet/Mvc/blob/6.0.0-rc1/src/Microsoft.AspNet.Mvc.Abstractions/ActionContext.cs#L25
然后我尝试了:
var contextMock = new Mock<ActionExecutingContext>(
new ActionContext(Mock.Of<HttpContext>(), new RouteData(), new ActionDescriptor()),
new IFilterMetadata[] { filter, },
new Dictionary<string, object>());
Run Code Online (Sandbox Code Playgroud)
但是当我打电话时,filter.OnActionExecuting(contextMock.Object)我收到以下错误:
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]
Run Code Online (Sandbox Code Playgroud)
如何测试使用ModelState的过滤器?
小智 31
我只是偶然发现同样的问题并以这种方式解决了它.
[Fact]
public void ValidateModelAttributes_SetsResultToBadRequest_IfModelIsInvalid()
{
var validationFilter = new ValidationFilter();
var modelState = new ModelStateDictionary();
modelState.AddModelError("name", "invalid");
var actionContext = new ActionContext(
Mock.Of<HttpContext>(),
Mock.Of<RouteData>(),
Mock.Of<ActionDescriptor>(),
modelState
);
var actionExecutingContext = new ActionExecutingContext(
actionContext,
new List<IFilterMetadata>(),
new Dictionary<string, object>(),
Mock.Of<Controller>()
);
validationFilter.OnActionExecuting(actionExecutingContext);
Assert.IsType<BadRequestObjectResult>(actionExecutingContext.Result);
}
Run Code Online (Sandbox Code Playgroud)
如果有人想知道当你继承自 IAsyncActionFilter
[Fact]
public async Task MyTest()
{
var modelState = new ModelStateDictionary();
var httpContextMock = new DefaultHttpContext();
httpContextMock.Request.Query = new QueryCollection(new Dictionary<string, StringValues> {}); // if you are reading any properties from the query parameters
var actionContext = new ActionContext(
httpContextMock,
Mock.Of<RouteData>(),
Mock.Of<ActionDescriptor>(),
modelState
);
var actionExecutingContext = new ActionExecutingContext(
actionContext,
new List<IFilterMetadata>(),
new Dictionary<string, object>(),
Mock.Of<Controller>()
)
{
Result = new OkResult() // It will return ok unless during code execution you change this when by condition
};
Mymock1.SetupGet(x => x.SomeProperty).Returns("MySomething");
Mymock2.Setup(x => x.GetSomething(It.IsAny<string>(), It.IsAny<string>())).ReturnsAsync(true);
var context = new ActionExecutedContext(actionContext, new List<IFilterMetadata>(), Mock.Of<Controller>());
await _classUnderTest.OnActionExecutionAsync(actionExecutingContext, async () => { return context; });
actionExecutingContext.Result.Should().BeOfType<OkResult>();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5603 次 |
| 最近记录: |