我知道通过使用ConfigureContainer属性实例化BasicAppHost和IoC来获取服务,但是添加过滤器的地方在哪里?有问题的测试从未触发全局过滤器:
[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的类,并使用c#servicestack客户端来调用我的服务上的方法。这确实会导致执行全局过滤器。
谢谢你, 斯蒂芬
答案 0 :(得分:3)
请求和响应过滤器仅针对通过HTTP Request Pipeline执行HTTP请求的集成测试触发。如果您需要测试完整的请求管道,则需要使用自托管集成测试。
在服务上调用方法只是这样做,即它只是在自动服务的服务上进行C#方法调用 - 没有中间代理魔术拦截其间的调用。