![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
MockHttpContext
Теперь создадим Mock-объекты для HttpContext в LessonProject.UnitTest:
MockHttpContext.cs в (/Mock/HttpContext.cs): public class MockHttpContext: Mock< HttpContextBase> { [Inject] public HttpCookieCollection Cookies { get; set; }
public MockHttpCachePolicy Cache { get; set; } public MockHttpBrowserCapabilities Browser { get; set; } public MockHttpSessionState SessionState { get; set; } public MockHttpServerUtility ServerUtility { get; set; } public MockHttpResponse Response { get; set; } public MockHttpRequest Request { get; set; }
public MockHttpContext(MockBehavior mockBehavior = MockBehavior.Strict) : this(null, mockBehavior) { }
public MockHttpContext(IAuthentication auth, MockBehavior mockBehavior = MockBehavior.Strict) : base(mockBehavior) { //request Browser = new MockHttpBrowserCapabilities(mockBehavior); Browser.Setup(b => b.IsMobileDevice).Returns(false);
Request = new MockHttpRequest(mockBehavior); Request.Setup(r => r.Cookies).Returns(Cookies); Request.Setup(r => r.ValidateInput()); Request.Setup(r => r.UserAgent).Returns(" Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11"); Request.Setup(r => r.Browser).Returns(Browser.Object); this.Setup(p => p.Request).Returns(Request.Object);
//response Cache = new MockHttpCachePolicy(MockBehavior.Loose);
Response = new MockHttpResponse(mockBehavior); Response.Setup(r => r.Cookies).Returns(Cookies); Response.Setup(r => r.Cache).Returns(Cache.Object); this.Setup(p => p.Response).Returns(Response.Object);
//user if (auth! = null) { this.Setup(p => p.User).Returns(() => auth.CurrentUser); } else { this.Setup(p => p.User).Returns(new UserProvider(" ", null)); }
//Session State SessionState = new MockHttpSessionState(); this.Setup(p => p.Session).Returns(SessionState.Object);
//Server Utility ServerUtility = new MockHttpServerUtility(mockBehavior); this.Setup(p => p.Server).Returns(ServerUtility.Object);
//Items var items = new ListDictionary(); this.Setup(p => p.Items).Returns(items); } }
Кроме этого создаем еще такие классы: · MockHttpCachePolicy · MockHttpBrowserCapabilities · MockHttpSessionState · MockHttpServerUtility · MockHttpResponse · MockHttpRequest
Все эти mock-объекты весьма тривиальны, кроме MockSessionState, где и хранится session-storage (/Mock/Http/MockHttpSessionState.cs): public class MockHttpSessionState: Mock< HttpSessionStateBase> { Dictionary< string, object> sessionStorage;
public MockHttpSessionState(MockBehavior mockBehavior = MockBehavior.Strict) : base(mockBehavior) { sessionStorage = new Dictionary< string, object> (); this.Setup(p => p[It.IsAny< string> ()]).Returns((string index) => sessionStorage[index]); this.Setup(p => p.Add(It.IsAny< string> (), It.IsAny< object> ())).Callback< string, object> ((name, obj) => { if (! sessionStorage.ContainsKey(name)) { sessionStorage.Add(name, obj); } else { sessionStorage[name] = obj; } }); } } Создаем FakeAuthCookieProvider.cs (/Fake/FakeAuthCookieProvider.cs):
public class FakeAuthCookieProvider: IAuthCookieProvider { [Inject] public HttpCookieCollection Cookies { get; set; }
public HttpCookie GetCookie(string cookieName) { return Cookies.Get(cookieName); }
public void SetCookie(HttpCookie cookie) { if (Cookies.Get(cookie.Name)! = null) { Cookies.Remove(cookie.Name); } Cookies.Add(cookie); } } Фух! Инициализируем это в UnitTestSetupFixture.cs (/Setup/UnitTestSetupFixture.cs):
protected virtual void InitAuth(StandardKernel kernel) { kernel.Bind< HttpCookieCollection> ().To< HttpCookieCollection> (); kernel.Bind< IAuthCookieProvider> ().To< FakeAuthCookieProvider> ().InSingletonScope(); kernel.Bind< IAuthentication> ().ToMethod< CustomAuthentication> (c => { var auth = new CustomAuthentication(); auth.AuthCookieProvider = kernel.Get< IAuthCookieProvider> (); return auth; }); } Заметим, что Bind происходит на SingletonScope(), т.е. единожды авторизовавшись в каком-то тесте, мы в последующих тестах будем использовать эту же авторизацию.
Компилим и пытаемся с этим всем взлететь. Сейчас начнется магия..
|