2011-07-01 194 views
2

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

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

回答

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) 
    {} 
} 

或者,也可能更好一点,更灵活的设计将是创建一个测试缝通过将会话中的交互包装在另一个对象中。随后可以将其更改为基于数据库,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; 
    } 
} 

然后可以使用最小起订量来创建你的测试一个模拟IStateStorage实现或创建一个简单的基于字典的实现。

希望有所帮助。

+0

我喜欢可怜的人类比。:) – theusguy

0

含糊不清的问题,但我仍试图让你有一些想法。可能,你可以稍微澄清一下你的问题。

你可以用模拟,间谍或伪造对象替换你的会话助手。因此,在完成工作单元后,您可以验证所有必要的数据都已到达会话助手。在我看来,虚假的对象是可取的,但我不了解你的案件足够的细节。如何将此虚假信息传递给会话取决于您的设计。例如,会话助手可以在其构建过程中传递到工作单元中。或者你可以像你写的那样使用资源库,但是你必须将资源库注入到工作单元中,并且可能会创建额外的假库来返回假会话助手。其他解决方案也存在。

请注意,会话帮助程序和会话本身之间的交互细节也应该单独进行单元测试。但是,如果你的会话助手是一个非常简单的对象,那么你可以测试数据正确到达会话。因此,你的会话助手将被间接测试,你不需要为创建单独的测试而烦恼。