繁体   English   中英

如何伪造 ResultExecutionDelegate 来对 IAsyncResultFilter 进行单元测试

[英]How do I fake a ResultExecutionDelegate to unit test an IAsyncResultFilter

测试时我IAsyncResultFilter我知道如何创建ResultExecutingContextOnResultExecutionAsync ,但我不知道我应该做的,以创建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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM