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

时间:2014-05-22 22:13:10

标签: c# unit-testing session servicestack

我们有一个ServiceStack 3.9.x服务,我们正在尝试端到端地进行单元测试(通过进程内服务主机并通过C#本机客户端访问它),我们遇到了阻止会话似乎无法通过我们通常以这种方式运行时访问它的方式访问。

我们通常使用以下方法访问当前会话(使用servicestack的内置系统和自定义AuthSession和提供程序,这些都可以在IIS中针对从AppHostBase派生的AppHost运行良好):

EndpointHost.AppHost.TryResolve<ICacheClient>().SessionAs<SsoUserSession>();

但是,当尝试在单元测试中访问它时(针对从AppHostHttpListenerBase派生的AppHost),我们得到一个异常,试图进入会话:“只支持通过Singletons访问的ASP.NET请求”,这似乎是SessionFeature中的硬编码错误。

所以问题是:当通过从AppHostHttpListenerBase派生的服务主机进行单元测试时,是否可以通过缓存提供程序访问会话?如果是这样,怎么样?

1 个答案:

答案 0 :(得分:2)

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

我处理它的方法是创建类似扩展方法的东西,从刚刚调用base的缓存客户端获取会话,但在调用base..check之前,首先检查会话的IoC容器。如果它在那里,只需使用它,我只是在测试时注入我想要使用的会话。

这是在servicestack中的某个地方使用但我似乎无法找到执行此操作的方法...无论如何,扩展方法可能看起来像这样

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容器中看到什么样的延迟。

奇怪的是添加该代码只是为了测试,但是哦,对我有用并节省我的时间:)。