गिल्बर्ट,
शायद मैं आपके लिए बहुत देर हो चुकी हूं। मैं एमएसपीसी का उपयोग कर रहा हूं, लेकिन मुझे लगता है कि अवधारणाएं समान हैं। मुझे परीक्षण के तहत नियंत्रकों में HttpContext के कई घटकों का नकल करने की आवश्यकता थी।
मैंने निम्नलिखित निम्नलिखित कक्षाओं के साथ HttpContextBase में आवश्यक (मेरे उद्देश्यों के लिए) घटकों को नकल करने के लिए शुरुआत की। मैं कक्षाओं के अंदर केवल आवश्यक टुकड़ों को ओवरराइड करता हूं। नियंत्रक में आपको आवश्यक मोक्स के रूप में आपकी ज़रूरतें अलग-अलग होंगी। पैटर्न को समझने के बाद आवश्यकतानुसार मोक्स जोड़ना काफी आसान है।
public class MockHttpContext : HttpContextBase
{
private readonly HttpRequestBase _request = new MockHttpRequest();
private readonly HttpServerUtilityBase _server = new MockHttpServerUtilityBase();
private HttpSessionStateBase _session = new MockHttpSession();
public override HttpRequestBase Request
{
get { return _request; }
}
public override HttpServerUtilityBase Server
{
get { return _server; }
}
public override HttpSessionStateBase Session
{
get { return _session; }
}
}
public class MockHttpRequest : HttpRequestBase
{
private Uri _url = new Uri("http://www.mockrequest.moc/Controller/Action");
public override Uri Url
{
get { return _url; }
}
}
public class MockHttpServerUtilityBase : HttpServerUtilityBase
{
public override string UrlEncode(string s)
{
//return base.UrlEncode(s);
return s; // Not doing anything (this is just a Mock)
}
}
public class MockHttpSession : HttpSessionStateBase
{
// Started with sample http://stackoverflow.com/questions/524457/how-do-you-mock-the-session-object-collection-using-moq
// from http://stackoverflow.com/users/81730/ronnblack
System.Collections.Generic.Dictionary<string, object> _sessionStorage = new System.Collections.Generic.Dictionary<string,object>();
public override object this[string name]
{
get { return _sessionStorage[name]; }
set { _sessionStorage[name] = value; }
}
public override void Add(string name, object value)
{
_sessionStorage[name] = value;
}
}
मैक्स (एमएसपीईसी) का उपयोग करने के लिए मैं कंट्रोलर संदर्भ कैसे स्थापित करता हूं। यह contoller पर वास्तविक परीक्षण के लिए सेटअप (परीक्षण इस वर्ग से निकाले जाते हैं) है
public abstract class BlahBlahControllerContext
{
protected static BlahBlahController controller;
Establish context =() =>
{
controller = new BlahBlahController();
controller.ControllerContext = new ControllerContext()
{
Controller = controller,
RequestContext = new RequestContext(new MockHttpContext(), new RouteData()),
};
};
}
आगे यहाँ इसे समझने के लिए एक परीक्षण (MSpec दुनिया में विशिष्टता) है कि नकली सत्र का उपयोग करता है:
[Subject("ACCOUNT: Retrieve Password")]
public class retrieve_password_displays_retrieve_password2_page_on_success : BlahBlahControllerContext
{
static ActionResult result;
static RetrievePasswordModel model;
Establish context =() =>
{
model = new RetrievePasswordModel()
{
UserName = "Mike"
};
};
Because of =() =>
{
result = controller.RetrievePassword(model);
};
It should_return_a_RedirectToRouteResult =() =>
{
result.is_a_redirect_to_route_and().action_name().ShouldEqual("RetrievePassword2");
};
It session_should_contain_UN_value =() =>
{
controller.HttpContext.Session["UN"].ShouldEqual("Mike");
};
It session_should_contain_PQ_value =() =>
{
controller.HttpContext.Session["PQ"].ShouldEqual("Question");
};
}
मुझे एहसास है कि यह राइनो मोक्स का उपयोग नहीं करता है। मुझे आशा है कि यह सिद्धांतों को दिखाता है और पाठक इसे अपने विशिष्ट औजारों और तरीकों से अपना सकते हैं।
आप webforms बारे में बात कर रहे हैं, यह http://stackoverflow.com/questions/1981426/how-do-i-mock-fake-the-s का डुप्लिकेट है ession-object-in-asp-net-web-form – PHeiberg