单元测试 - 会话对象?

Jos*_*eld 2 c# unit-testing

我最近实现了一个工作单元模式,作为一个环境,我们正在使用更多的单元测试.目前,实现写入会话助手,写入会话.我如何在会话方面对这些方面进行单元测试?我应该制作存储库模式吗?(具体会话实现的存储库接口和具体的模拟实现)通常如何完成?

我知道可能不止一种方法来解决这个问题,但我只是在寻找一些建议.

Rob*_*ett 8

基本上有两种方法可以做到这一点.

假设您使用的是.NET 3.5或更高版本.更改您的实现以将HttpSessionStateBase对象作为构造函数参数,然后您可以模拟此实现 - 有一些关于如何执行此操作的在线教程.然后,您可以使用IoC容器在应用程序启动时连接它或执行类似(穷人的依赖注入):

public class MyObjectThatUsesSession
{
    HttpSessionStateBase _session;

    public MyObjectThatUsesSession(HttpSessionStateBase sesssion)
    {
         _session = session ?? new HttpSessionStateWrapper(HttpContext.Current.Session);
    }

    public MyObjectThatUsesSession() : this(null)
    {}
}
Run Code Online (Sandbox Code Playgroud)

或者,可能更好,更灵活的设计是通过在另一个对象中包含与会话的交互来创建测试接缝.然后,您可以稍后将其更改为基于数据库,cookie或缓存的实现.就像是:

public class MyObjectThatUsesSession
{
    IStateStorage _storage;

    public MyObjectThatUsesSession(IStateStorage storage)
    {
         _storage= storage ?? new SessionStorage();
    }

    public MyObjectThatUsesSession() : this(null)
    {}

    public void DoSomethingWithSession()
    {
        var something = _storage.Get("MySessionKey");
        Console.WriteLine("Got " + something);
    }
}

public interface IStateStorage
{
    string Get(string key);
    void Set(string key, string data);
}

public class SessionStorage : IStateStorage
{
    //TODO: refactor to inject HttpSessionStateBase rather than using HttpContext.

    public string Get(string key)
    {
       return HttpContext.Current.Session[key];
    }

    public string Set(string key, string data)
    {
       HttpContext.Current.Session[key] = data;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用Moq为测试创建模拟IStateStorage实现,或者创建基于字典的简单实现.

希望有所帮助.