在单元测试期间通过ICacheClient访问会话
本文关键字:ICacheClient 访问 会话 单元测试 | 更新日期: 2023-09-27 18:04:37
我们已经有了ServiceStack 3.9。我们正在尝试端到端的单元测试(通过进程内服务主机并通过c#本地客户端访问它),并且我们遇到了一个障碍,似乎无法通过我们通常使用的方式访问会话。
我们通常使用以下方式访问当前会话(使用servicestack的内置系统和自定义AuthSession和提供商,它们在IIS中运行时都可以很好地针对从AppHostBase派生的AppHost):
EndpointHost.AppHost.TryResolve<ICacheClient>().SessionAs<SsoUserSession>();
然而,当试图在单元测试中访问它时(针对从AppHostHttpListenerBase派生的AppHost),我们得到一个异常,试图在会话中获得:"Only ASP. net . net "。支持通过单例访问的。NET请求",这似乎是SessionFeature中的硬编码错误。
所以问题是这样的:当单元测试时,可以通过缓存提供程序访问会话,通过从AppHostHttpListenerBase派生的服务主机?如果有,是怎么做到的?
我以前也遇到过这种情况。
我处理它的方式是创建一个类似于扩展方法的东西,从缓存客户端获取会话,只是调用基础,但在调用基础之前,首先检查会话的IoC容器。如果它在那里,就用它代替,我只注入我想在测试时使用的会话。
这是在服务堆栈的某个地方使用,但我似乎找不到这样做的方法…无论如何,一个扩展方法可以看起来像这样
public static MyTypedSession GetMyTypedSession(this ICacheClient cache)
{
var typedSession = ServiceStackHost.Instance.Container.TryResolve<MyTypedSession>();
if (typedSession != default(MyTypedSession))
return typedSession;
return cache.SessionAs<MyTypedSession>();
}
然后,而不是调用SessionAs
在您的代码中获得类型会话,您只需调用GetMyTypedSession
,它将工作良好的测试,只要你Register
你的假MyTypedSession
下面是一些c# psuedo测试方法
public void SomeTestMethod()
{
var session = new MyTypedSession { IsAuthenticated = true; };
//get your container and register the session
container.Register(session);
var someValue = TestCodeThatUsesASession();
Assert(someValue);
}
我不确定每次需要会话时在IoC容器中查找的延迟是什么。
添加这些代码只是为了测试有点奇怪,但是,哦,好吧,这对我来说很有效,节省了我的时间:)。