【发布时间】:2013-02-20 15:12:58
【问题描述】:
我正在使用 ServiceStack / StructureMap / Moq。该服务调用类型为 ServiceStack.CacheAccess.ISession 的 Session。对于单元测试,我使用 Moq 创建了一个 Mock 对象,并将其添加到 StructureMap 配置中:
protected Mock<ISession> sessionMock = new Mock<ISession>();
ObjectFactory.Configure(
cfg =>
{
cfg.For<ISession>().Use(sessionMock.Object);
但是,当 Session 对象为空时,我并不感到惊讶——我很确定我遗漏了一步。我还需要做什么才能用模拟对象填充我的 Session 属性?
[编辑] 这是一个简单的测试场景
要测试的代码。简单的请求/服务
[Route("getKey/{key}")]
public class MyRequest:IReturn<string>
{
public string Key { get; set; }
}
public class MyService:Service
{
public string Get(MyRequest request)
{
return (string) Session[request.Key];
}
}
基础测试类和 MockSession 类
// test base class
public abstract class MyTestBase : TestBase
{
protected IRestClient Client { get; set; }
protected override void Configure(Container container)
{
// this code is never reached under any of my scenarios below
container.Adapter = new StructureMapContainerAdapter();
ObjectFactory.Initialize(
cfg =>
{
cfg.For<ISession>().Singleton().Use<MockSession>();
});
}
}
public class MockSession : ISession
{
private Dictionary<string, object> m_SessionStorage = new Dictionary<string, object>();
public void Set<T>(string key, T value)
{
m_SessionStorage[key] = value;
}
public T Get<T>(string key)
{
return (T)m_SessionStorage[key];
}
public object this[string key]
{
get { return m_SessionStorage[key]; }
set { m_SessionStorage[key] = value; }
}
}
和测试。请参阅 cmets 了解我看到失败的地方。我真的不希望版本 1 和 2 能够工作,但希望版本 3 能够。
[TestFixture]
public class When_getting_a_session_value:MyTestBase
{
[Test]
public void Test_version_1()
{
var session = ObjectFactory.GetInstance<MockSession>();
session["key1"] = "Test";
var request = new MyRequest {Key = "key1"};
var client = new MyService(); // generally works fine, except for things like Session
var result = client.Get(request); // throws NRE inside MyService
result.ShouldEqual("Test");
}
[Test]
public void Test_version_2()
{
var session = ObjectFactory.GetInstance<MockSession>();
session["key1"] = "Test";
var request = new MyRequest {Key = "key1"};
var client = ObjectFactory.GetInstance<MyService>();
var result = client.Get(request); // throws NRE inside MyService
result.ShouldEqual("Test");
}
[Test]
public void Test_version_3()
{
var session = ObjectFactory.GetInstance<MockSession>();
session["key1"] = "Test";
var request = new MyRequest {Key = "key1"};
var client = CreateNewRestClient();
var result = client.Get(request); // throws NotImplementedException here
result.ShouldEqual("Test");
}
}
【问题讨论】:
-
我认为这是因为我在单元测试时没有正确配置 StructureMap 适配器。不知道该怎么做...
-
你能展示所有的测试代码吗?也就是说,我们可以看到你是如何调用服务的?
-
添加了显示问题以及我如何尝试解决问题的代码。
标签: moq structuremap servicestack