首页 > 解决方案 > 在 .NET Core Web 应用程序中测试路由

问题描述

我正在尝试编写一套测试,以确认预期的路线将转到正确的控制器/操作。

我通过查看其他地方的示例完成了其中的一部分,但现在我不知道如何(或是否可能)从我可用的对象中获取控制器详细信息。

[Test]
public void Test_A_Route()
{
    var server = new TestServer(
                new WebHostBuilder()
                .UseEnvironment("Development")
                .UseConfiguration(GetConfiguration())
                .UseStartup<Startup>());
    var client = server.CreateClient();

    var response = client.GetAsync("/My/Url/").GetAwaiter().GetResult();
    response.EnsureSuccessStatusCode();

    string contentResult = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();
    contentResult.Should().Contain("Some text from my webpage that is hopefully unique");
}

我希望能够验证以下内容:

知道该怎么做吗?

标签: c#asp.net-mvcasp.net-core

解决方案


我认为您可以将此 IActionFilter 用于此任务:

public class DebugFilter : IActionFilter
{
    bool enabled = false;
    IDictionary<string, object> arguments = null;

    public void OnActionExecuting(ActionExecutingContext context)
    {
        enabled = context.HttpContext.Request.Headers.ContainsKey("X-Debug");
        if (enabled)
        {
            arguments = context.ActionArguments;
        }
    }

    public void OnActionExecuted(ActionExecutedContext context)
    {
        if (enabled)
        {
            var controllerName = context.Controller.GetType().Name;
            var actionName = context.ActionDescriptor.DisplayName;

            context.HttpContext.Response.Headers.Add("X-Controller-Name", controllerName);
            context.HttpContext.Response.Headers.Add("X-Action-Name", actionName);
            context.HttpContext.Response.Headers.Add("X-Action-Model", JsonConvert.SerializeObject(arguments));
        }
    }
}

并在您的 Startup.cs 文件中全局注册它:

        #if DEBUG
        services.AddMvc(options =>
        {
            options.Filters.Add(new DebugFilter());
        })
        #else
        services.AddMvc()
        #endif
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

之后,您只在测试中包含“X-Debug”标头,并从响应标头中接收您想要的所有信息。

邮递员响应屏幕

编辑:这是一个非常简单的类,您可以访问 ViewData、Result、TempData 等等


推荐阅读