我最近实现了一个工作单元模式,作为一个环境,我们正在使用更多的单元测试。目前,实现写入会话助手,写入会话。我如何在会话方面对这些方面进行单元测试?我应该制作存储库模式吗? (具体会话实现的存储库接口和具体的模拟实现)通常如何完成?
我知道可能不止一种方法可以解决这个问题,但我只是在寻找一些建议。
答案 0 :(得分: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;
}
}
然后,您可以使用Moq为您的测试创建一个模拟IStateStorage实现,或者创建一个基于字典的简单实现。
希望有所帮助。
答案 1 :(得分:0)
有点模糊的问题,但我仍然试图给你一些想法。也许,你可以稍微澄清一下你的问题。
您可以使用mock,spy或fake对象替换会话助手。因此,在完成工作单元后,您可以验证所有必要的数据是否已达到会话帮助程序。在我看来,假对象是可取的,但我不了解你的案例的足够细节。如何将这个假装送到会话取决于您的设计。例如,会话助手可以在构建期间传递到工作单元中。或者您可以在编写时使用存储库,但是您必须将存储库注入工作单元,并且可能创建额外的虚假存储库以返回假会话帮助程序。其他解决方案也存在。
请注意,会话助手和会话本身之间的交互细节也应单独进行单元测试。但是,如果您的会话助手是一个非常简单的对象,那么您可以正确地测试该数据到达会话。因此,您的会话助手将进行间接测试,您无需费心去创建单独的测试。