#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. Затем я использую другой тестовый проект для тестирования своих сервисов.