2015-05-04 3 views
1

Я знаю, что службы подключаются, создавая экземпляр BasicAppHost и IoC, используя свойство ConfigureContainer, но где это место для добавления фильтров? Испытание на вопрос никогда не сгореть глобального фильтра:Фильтры запроса запускаются из BasicAppHost?

[TestFixture] 
public class IntegrationTests 
{ 
    private readonly ServiceStackHost _appHost; 

    public IntegrationTests() 
    { 
     _appHost = new BasicAppHost(typeof(MyServices).Assembly) 
     { 
      ConfigureContainer = container => 
      { 
       // 
      } 
     }; 
     _appHost.Plugins.Add(new ValidationFeature()); 
     _appHost.Config = new HostConfig { DebugMode = true }; 
     _appHost.GlobalRequestFilters.Add(ITenantRequestFilter); 
     _appHost.Init(); 
    } 

    private void ITenantRequestFilter(IRequest req, IResponse res, object dto) 
    { 
     var forTennant = dto as IForTenant; 
     if (forTennant != null) 
      RequestContext.Instance.Items.Add("TenantId", forTennant.TenantId); 
    } 

    [TestFixtureTearDown] 
    public void TestFixtureTearDown() 
    { 
     _appHost.Dispose(); 
    } 

    [Test] 
    public void CanInvokeHelloServiceRequest() 
    { 
     var service = _appHost.Container.Resolve<MyServices>(); 

     var response = (HelloResponse)service.Any(new Hello { Name = "World" }); 

     Assert.That(response.Result, Is.EqualTo("Hello, World!")); 
    } 

    [Test] 
    public void CanInvokeFooServiceRequest() 
    { 
     var service = _appHost.Container.Resolve<MyServices>(); 

     var lead = new Lead 
     { 
      TenantId = "200" 
     }; 

     var response = service.Post(lead); //Does not fire filter. 
    } 
} 

ServiceStack установлен на 4.0.40

Обновлено Ознакомившись с ServiceStack тесты (которые я очень рекомендую BTW) я наткнулся на несколько примеров из AppHost используется И тестируется. Похоже, что свойство ConfigureAppHost - это подходящее место для настройки фильтров, например.

ConfigureAppHost = host => 
    { 
     host.Plugins.Add(new ValidationFeature()); 
     host.GlobalRequestFilters.Add(ITenantRequestFilter); 
    }, 
ConfigureContainer = container => 
    { 
    } 

Updated1 И они до сих пор не срабатывают.

Updated2

После небольшого количества проб и ошибок я думаю, можно с уверенностью сказать, что NO, фильтры не зацепили при использовании BasicAppHost. То, что я сделал, чтобы решить мою проблему, заключалось в том, чтобы переключить эти тесты на использование класса, который наследуется от AppSelfHostBase, и использовать клиентов cic servicestack для вызова методов моей службы. ЭТО приводит к тому, что глобальные фильтры будут выполнены.

Спасибо, Стефане

ответ

3

Нет запрос и ответ фильтры только огнь для интеграции тестов, где HTTP-запрос выполняется через HTTP Request Pipeline. Если вам нужно протестировать полный конвейер запросов, вам нужно будет использовать тест интеграции самостоятельной хостинга.

Вызов метода в службе просто делает это, то есть буквально просто вызывает вызов метода C# в службе с автоподдержкой - нет промежуточной прокси-магии, перехватывающей вызов между ними.