在单元测试期间通过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派生的服务主机?如果有,是怎么做到的?

在单元测试期间通过ICacheClient访问会话

我以前也遇到过这种情况。

我处理它的方式是创建一个类似于扩展方法的东西,从缓存客户端获取会话,只是调用基础,但在调用基础之前,首先检查会话的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容器中查找的延迟是什么。

添加这些代码只是为了测试有点奇怪,但是,哦,好吧,这对我来说很有效,节省了我的时间:)。