unit testing – 会话对象?

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

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

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

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

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

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

希望有所帮助。

有点模糊的问题,但我仍然试着给你一些想法。 也许,你可以稍微澄清一下你的问题。

您可以使用mock,spy或fake对象替换会话助手。 因此,在完成工作单元后,您可以validation所有必要的数据是否已达到会话帮助程序。 在我看来,假对象是可取的,但我不了解你的案例的足够细节。 如何将这个假装送到会话取决于您的设计。 例如,会话助手可以在构建期间传递到工作单元中。 或者您可以在编写时使用存储库,但是您必须将存储库注入工作单元,并可能创建额外的虚拟存储库以返回虚假会话帮助程序。 其他解决方案也存在。

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