ServiceStack/StructureMap/Ad. Kullanıyorum. Hizmet, ServiceStack.CacheAccess.ISession türü olan Session'a bir çağrı yapar. Ben Gidiyorum eminim - Oturum nesnesi boş iken şaşırmadım, AncakServiceStack ISession'ı Moq ve StructureMap kullanarak nasıl alay ediyorsunuz?
protected Mock<ISession> sessionMock = new Mock<ISession>();
ObjectFactory.Configure(
cfg =>
{
cfg.For<ISession>().Use(sessionMock.Object);
: ünite testleri için, ben MOQ kullanarak Mock nesne oluşturulur ve StructureMap yapılandırmasına eklendi bir adım dışarı. Session özelliğimi sahte bir nesne ile doldurmak için başka ne yapmam gerekir?
[DÜZENLE] İşte
Kodu sınamak için basit bir test senaryo. Basit istek/hizmet
[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];
}
}
baz testi sınıf ve MockSession sınıfları
// 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; }
}
}
Ve testler. Hatayı görüyorum nerede yorumları görmek. 1 & 2 sürümünün gerçekten çalışmasını beklemiyordum, ancak umduğum 3 sürümü.
[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");
}
}
I: Eğer
AppHost.TestMode=true
ServiceStack sizin IOC içinde kayıtlıIAuthSession
, örneğin dönecektir set Aksi takdirde:
Sen mesela,
Request.Items["__session"]
bir örneğini kaydederek Oturum alay edebilir Bunun nedeni, birim testi yapıldığında, StructureMap adaptörünün düzgün bir şekilde yapılandırılmamış olması. Bunu nasıl yapacağınızdan emin değilsiniz ... –Test için tüm kodu gösterebilir misiniz? Yani, servisi nasıl aradığını görebilelim mi? – mythz
Sorunu ve nasıl çözmeyi denediğimi gösteren kod eklendi. –