在.NET Core Web应用程序中测试路由

时间:2019-01-21 17:55:49

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

我正在尝试编写一组测试,以确认预期的路由是否将到达正确的Controllers / Actions。

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

[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");
}

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

  • 控制器名称
  • 视图名称
  • 模型

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

要获取控制器详细信息,建议您使用Flurl。如您在项目文档here及以下所示,您可以按以下方式声明控制器的详细信息。据我了解,该库伪造了HttpClient,并且可以通过单元测试的方式来获取控制器方法的详细信息。我觉得这个项目非常可行,希望对您有帮助。

    // fake & record all http calls in the test subject
    using (var httpTest = new HttpTest()) {
    // arrange
    httpTest.RespondWith(200, "OK");
    // act
    await yourController.CreatePersonAsync();
    // assert
    httpTest.ShouldHaveCalled("https://api.com/*")
        .WithVerb(HttpMethod.Post)
        .WithContentType("application/json");
}

答案 1 :(得分:1)

我认为您可以将此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”标头,并从响应标头接收您想要的所有信息。

Postman screen of response

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