C# 单元测试-会话对象?

C# 单元测试-会话对象?,c#,unit-testing,C#,Unit Testing,我最近实现了一个工作单元模式,作为一个环境,我们正在使用更多的单元测试。当前,实现将写入写入会话的会话帮助器。如何针对会话对这些方面进行单元测试?我应该创建一个存储库模式吗?(具有具体会话实现和具体模拟实现的存储库接口)这通常是如何实现的 我知道这可能不止一种方法,但我只是想寻求一些建议。基本上有两种方法 假设您使用的是.NET3.5或更高版本。将您的实现更改为将HttpSessionStateBase对象作为构造函数参数,然后您可以模拟此实现——在线上有一些教程介绍了如何执行此操作。然后,您可

我最近实现了一个工作单元模式,作为一个环境,我们正在使用更多的单元测试。当前,实现将写入写入会话的会话帮助器。如何针对会话对这些方面进行单元测试?我应该创建一个存储库模式吗?(具有具体会话实现和具体模拟实现的存储库接口)这通常是如何实现的


我知道这可能不止一种方法,但我只是想寻求一些建议。

基本上有两种方法

假设您使用的是.NET3.5或更高版本。将您的实现更改为将HttpSessionStateBase对象作为构造函数参数,然后您可以模拟此实现——在线上有一些教程介绍了如何执行此操作。然后,您可以在应用程序启动时使用IoC容器将其连接起来,或者执行类似(穷人的依赖注入)的操作:

或者,更好、更灵活的设计可能是通过将与会话的交互包装在另一个对象中来创建测试接缝。随后,您可以将其更改为基于数据库、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;
    }
}
然后,您可以使用Moq为您的测试创建一个模拟IStateStorage实现,或者创建一个简单的基于字典的实现


希望这能有所帮助。

这个问题有些模糊,但我还是想给你一些想法。也许,你能稍微澄清一下你的问题

您可以用mock、spy或fake对象替换会话助手。所以,在完成工作单元后,您可以验证所有必要的数据是否已到达会话助手。在我看来,假冒伪劣商品更可取,但我对你的案件不太了解。如何将此假任务发送到会话取决于您的设计。例如,会话助手可以在构建过程中传递到工作单元中。或者,您可以按照编写的方式使用存储库,但随后必须将存储库注入工作单元,并可能创建额外的假存储库以返回假会话帮助程序。还有其他解决办法

注意,会话助手和会话本身之间的交互细节也应该单独进行单元测试。但若会话助手是一个非常简单的对象,那个么可以测试数据是否正确到达会话。因此,您的会话助手将被间接测试,您无需费心创建单独的测试

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;
    }
}