ServiceStack (5.5.0) — при тестировании шлюза ServiceStackController имеет значение null и выдает исключение

#servicestack

#servicestack

Вопрос:

Используя ServiceStack (версия 5.5.0), я прочитал, что рекомендуемый подход к вызову служб через контроллер заключается в использовании шлюза. Полный пример находится по адресу https://github.com/RhysWilliams647/ServiceStackControllerTest

 public class HomeController : ServiceStackController
    {
        public ActionResult Index()
        {
            var response = Gateway.Send<TestServiceResponse>(new TestServiceRequest());
            IndexModel model = new IndexModel { Message = response.Message };

            return View(model);
        }

        public ActionResult About()
        {
            ViewBag.Message = "Your application description page.";

            return View();
        }

        public ActionResult Contact()
        {
            ViewBag.Message = "Your contact page.";

            return View();
        }
    }
 

Однако при тестировании моего контроллера через xUnit я получаю ошибку исключения null, поскольку Gateway имеет значение null. Ниже приведен мой AppHost

 public class AppHost : AppSelfHostBase
    {

        public AppHost() : base("Test", typeof(TestService).Assembly)
        {

        }

        public override IServiceGateway GetServiceGateway(IRequest req) =>
            base.GetServiceGateway(req ?? new BasicRequest());

        public override void Configure(Container container)
        {
            SetConfig(new HostConfig
            {
                HandlerFactoryPath = "api"
            });


            container.RegisterFactory<HttpContext>(() => HttpContext.Current);
            // register container for mvc
            ControllerBuilder.Current.SetControllerFactory(new FunqControllerFactory(container));
        }
    }
 

И мой тест

 [Trait("Category", "Controllers")]
    [Collection("AppHostFixture")]
    public class ControllerTest
    {
        [Fact]
        public void CanCallHomeControllerIndex()
        {
            var controller = new HomeController();
            controller.Index();
        }
    }
 

Может кто-нибудь посоветовать, как протестировать ServiceStackController, вызывающий сервисный шлюз?

Ответ №1:

AppSelfHostBase в .NET Framework есть собственный хост HttpListener, который не поддерживает MVC, поэтому вы не сможете запускать какие-либо интеграционные тесты.

При создании нового экземпляра контроллера MVC, подобного этому:

 var controller = new HomeController();
 

Это base.HttpContext требуется ServiceStackController не существует, для этого требуется ASP.NET HttpContext но самостоятельный хост в модульном тестировании выполняется на самостоятельном сервере HttpListener.

Вы можете попробовать получить доступ к шлюзу через HostContext одноэлементный, т.е.:

 var gateway = HostContext.AppHost.GetServiceGateway(new BasicRequest());
var response = gateway.Send<TestServiceResponse>(new TestServiceRequest());
 

В этом примере он вызывает шлюз с фиктивным контекстом Http-запроса для имитации запроса, но вы не сможете выполнить реальные тесты интеграции MVC с автономным Http-прослушивателем.

Комментарии:

1. Нет проблем. Итак, каков рекомендуемый подход к модульному тестированию контроллера mvc, который вызывает Gateway? Мне не нужно использовать AppSelfHostBase.

2. Используйте .NET Core, поскольку вы можете запускать реальное приложение ASP .NET Core MVC, работающее на Kestrel, в противном случае вам потребуется запустить экземпляр IIS Express и выполнить интеграционные тесты для этого удаленного экземпляра.

3. Я лично использую макет шлюза для тестирования моего ASP.NET Контроллеры MVC. Затем я использую другой тестовый проект для тестирования своих сервисов.