[英]How do I fake a ResultExecutionDelegate to unit test an IAsyncResultFilter
测试时我IAsyncResultFilter
我知道如何创建ResultExecutingContext
为OnResultExecutionAsync
,但我不知道我应该做的,以创建ResultExecutionDelegate
参数。
public class JsonPrefixFilter : IAsyncResultFilter
{
public async Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next)
我试图像这样指定我的代表:
ResultExecutionDelegate next = () => {
var response = executed.HttpContext.Response;
response.Headers["Content-Type"] = "application/json";
response.Body.Write(Encoding.UTF8.GetBytes("{}"));
return Task.FromResult(executed);
};
当过滤器运行时,在await next();
被调用,响应没有我指定的内容类型或正文。
使用委托语法创建委托的实例,并将其像任何其他变量一样传递给被测主题的调用。
//Arrange
HttpContext http = new DefaultHttpContext();
ResultExecutingContext executing = CreateResultExecutingContext(http); //local
ResultExecutedContext executed = CreateResultExecutedContext(http); //local
ResultExecutionDelegate next = () => {
//... do something
var response = executed.HttpContext.Response;
response.Headers["Content-Type"] = "application/json";
response.Body = new MemoryStream(Encoding.UTF8.GetBytes("{}"));
return Task.FromResult(executed);
};
var filter = new JsonPrefixFilter();
//...
//Act
await filter.OnResultExecutionAsync(executing, next);
//Assert
//...
其中辅助方法定义为
private static ActionContext CreateActionContext(HttpContext context) => new(context, new(), new());
private static ResultExecutedContext CreateResultExecutedContext(HttpContext context) =>
new ResultExecutedContext(CreateActionContext(context), Array.Empty<IFilterMetadata>(), new NoOpResult(), new());
private static ResultExecutingContext CreateResultExecutingContext(HttpContext context) =>
new ResultExecutingContext(CreateActionContext(context), Array.Empty<IFilterMetadata>(), new NoOpResult(), new object());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.