Тестирование маршрутов в веб-приложении .NET Core - PullRequest
0 голосов
/ 21 января 2019

Я пытаюсь написать набор тестов, которые подтвердят, что ожидаемые маршруты идут к нужным контроллерам / действиям.

У меня есть часть этого, глядя на примеры в других местах, но теперь я не знаю, как (или если это возможно) получить информацию о контроллере из доступных мне объектов.

[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 голосов
/ 21 января 2019

Я думаю, что вы можете использовать этот 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 и многим другим

0 голосов
/ 21 января 2019

Чтобы получить информацию о контроллере, я бы предложил вам использовать Flurl . Как вы можете видеть в документации проекта здесь и ниже, вы можете утверждать детали контроллера следующим образом. Как я понимаю, эта библиотека подделывает 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");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...