问题描述
我最近实施的工作模式的一个单元,并作为一个环境,我们使用的是更单元测试。目前执行写入的写入会话的会话帮手。我如何单元关于会话测试这些方面?我应该做一个存储库模式? (混凝土会话实现和具体的模拟实现库接口)这是怎么回事正常完成?
I have recently Implemented a unit of work pattern, and as an environment we are using more unit testing. Currently the implementation writes into a session helper that writes to session. How do I unit test these aspects in regard to the session? Should I make a repository pattern? (repository interface with concrete session implementation and concrete mock implementation) How is this normally done?
我知道有可能不止一个接近这种方式,但我只是寻找一些建议。
I know there is probably more than one way of approaching this, but I am just looking for some advice.
推荐答案
有基本上都是这样做的两种方式。
There are basically two ways of doing this.
假设你正在使用.NET 3.5或向上。更改您的实现采取HttpSessionStateBase对象作为构造函数的参数,然后你可以嘲笑这种实现 - 有关于如何做这个网上一些教程。然后,您可以使用IoC容器在应用程序开始这样组装起来或者做类似(穷人的依赖注入):
Assuming you are using .NET 3.5 or up. Change your implementation to take the HttpSessionStateBase object as a constructor parameter, you can then mock this implementation - there's a few tutorials online on how to do this. You can then use an IoC container to wire this up at app start or do something like (poor man's dependency injection):
public class MyObjectThatUsesSession
{
HttpSessionStateBase _session;
public MyObjectThatUsesSession(HttpSessionStateBase sesssion)
{
_session = session ?? new HttpSessionStateWrapper(HttpContext.Current.Session);
}
public MyObjectThatUsesSession() : this(null)
{}
}
另外,也许更好一点,更灵活的设计将是在另一个对象与会话包裹你的互动,创建一个测试缝。然后,您可以稍后将其更改为一个数据库,饼干或基于缓存实现。是这样的:
Alternatively, and probably a bit better and more flexible design would be to create a test seam by wrapping your interaction with session in another object. You could then change this to a database, cookie or cache based implementation later. Something like:
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实施为您的测试或创建一个简单的基于字典的实现。
You can then use Moq to create a mock IStateStorage implementation for your tests or create a simple dictionary based implementation.
希望有所帮助。
这篇关于单元测试 - Session对象?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!