2010-08-15 12 views
9

मुझे अपने यूनिट परीक्षणों से इसे एक्सेस करने के लिए नकली HttpContext.Current.Application तालिका की आवश्यकता है।यूनिट परीक्षणों के लिए मैं नकली HttpContext कैसे कर सकता हूं?

मुझे अपना डेटा कहीं और स्टोर करने की आवश्यकता है। मैंने सोचा कि मैं सिर्फ NameValueCollectionBase का उदाहरण पास कर सकता हूं लेकिन जैसा कि मैंने पाया कि इस बेस प्रकार में कोई अनुक्रमणिका नहीं है, इसलिए यह उपयोग करने में बहुत जटिल लगता है।

तो HttpContext के इस भाग को पकाने के बारे में क्या? क्या यह संभव है? मैं इसे कैसे बना सकता हूं? NUnit.Mocks होगा उपयोगी?

अग्रिम धन्यवाद ...

उत्तर

1

आप की जरूरत है NameValueCollection आधार के लिए अनुक्रमित कृपया परीक्षण तरीकों के आसपास गुजर कोड

public static IEnumerable<KeyValuePair<string, string>> ToPairs(this NameValueCollection collection) 
{ 
    if(collection == null) 
    { 
     throw new ArgumentNullException("collection"); 
    } 

    return collection.Cast<string>().Select(key => new KeyValuePair<string, string>(key, collection[key])); 
} 

नीचे का उपयोग करें सिर्फ डाटा स्टोर करने के लिए और उपरोक्त कोड का प्रयोग करें।

2

कृपया जाना नीचे के माध्यम से जोड़ता है यह आप में मदद मिलेगी।

http://www.java2s.com/Open-Source/CSharp/Web-Frameworks/MvcContrib/MvcContrib/TestHelper/Fakes/FakeHttpContext.cs.htm

Mocking and HttpContextBase.get_User()

धन्यवाद वेंकट

+0

समस्या है कि User' तो यह के प्रकार 'IPrincipal' नई वस्तु वापस जाने के लिए आसान है अगर यह' के बारे में है है, लेकिन जब यह 'Application' की बात आती है तो मैं कुछ' HttpApplicationState' वस्तु जो कोई सार्वजनिक निर्माता है वापस जाने के लिए की जरूरत है और इसके कारण इंडेक्सर्स के माध्यम से उपयोग करना 'NUnit.Mocks' के साथ नकली करना मुश्किल है ... क्या आप मुझे इस मामले के लिए कुछ कोड उदाहरण प्रदान कर सकते हैं? –

+0

हैलो, आप की जरूरत है NameValueCollection आधार के लिए अनुक्रमित कोड के नीचे का उपयोग करें सार्वजनिक स्थिर IEnumerable > ToPairs (इस NameValueCollection संग्रह) { अगर (संग्रह == नल) { फेंक नई ArgumentNullException ("संग्रह"); } वापसी संग्रह .कास्ट ()। चयन करें (कुंजी => नई कीवैल्यूयर <स्ट्रिंग, स्ट्रिंग> (कुंजी, संग्रह [कुंजी])); } केवल डेटा स्टोर करने और परीक्षण विधियों के चारों ओर गुजरने के लिए कृपया उपरोक्त कोड का उपयोग करें। – Venkat

+2

पहला लिंक काम नहीं करता है –

0

इस परिदृश्य में मैं System.Web.Abstractions में बेस क्लास से व्युत्पन्न कुछ स्टब्स उत्पन्न करता हूं। मैं अक्सर MVC अनुप्रयोगों के लिए इस तकनीक का प्रयोग के रूप में MVC/WebAPI नियंत्रकों के लिए एक अमूर्त शामिल HttpContext (HttpContextBase)

इस तरह मैं अपने इकाई/एकीकरण परीक्षणों में HttpContext आवश्यकताओं बाहर ठूंठ कर सकते हैं, यहाँ एक नमूना है ...

public class MockHttpApplicationState : HttpApplicationStateBase 
{ 
    private IDictionary<string, object> _appState = new Dictionary<string, object>(); 

    public override void Add(string name, object value) 
    { 
     _appState.Add(name, value); 
    } 

    public override object Get(string name) 
    { 
     return _appState[name]; 
    } 

    public override object this[string name] 
    { 
     get 
     { 
      return _appState[name]; 
     } 

     set 
     { 
      _appState[name] = value; 
     } 
    } 
} 

public class MockHttpContext : HttpContextBase 
{ 
    private IDictionary<string, object> _appKeys; 

    public MockHttpContext() 
    { 

    } 

    /// <summary> 
    /// Accepts a dictionary of app keys to supply to the HttpApplicationState instance 
    /// </summary> 
    /// <param name="applicationState"></param> 
    public MockHttpContext(IDictionary<string,object> applicationState) 
    { 
     _appKeys = applicationState; 
    } 

    public override Cache Cache 
    { 
     get 
     {     
      return HttpRuntime.Cache; 
     } 
    } 

    public override HttpApplicationStateBase Application 
    { 
     get 
     { 
      var mockAppState = new MockHttpApplicationState(); 

      foreach (string key in _appKeys.Keys) 
      { 
       mockAppState.Add(key, _appKeys[key]); 
      } 

      return mockAppState; 
     } 
    } 

    public override HttpRequestBase Request 
    { 
     get 
     { 
      return new HttpRequestWrapper(new HttpRequest(null,"http://localhost",null)); 
     } 
    } 
} 

फिर अपने परीक्षण नियंत्रक और Http प्रसंग स्थापित कर सकते हैं:

private readonly OnlineShop.MVC.Controllers.HomeController _controller = 
     new MVC.Controllers.HomeController(null,new UnitOfWork()); 

    [OneTimeSetUp] 
    public void Init() 
    { 
     var appKeys = new Dictionary<string, object>(); 

     appKeys.Add("localhost", 1); 

     var httpContext = new MockHttpContext(appKeys); 

     _controller.ControllerContext = new ControllerContext() 
     { 
      Controller = _controller, 
      RequestContext = new RequestContext(httpContext, new RouteData())  
     };       
    } 

    [Test] 
    public void Index_Returns_HomeView() 
    {    
     var view = _controller.Index() as ViewResult; 
     var viewModel = view.Model as MVC.ViewModels.Home; 

     Assert.IsInstanceOf<OnlineShop.MVC.ViewModels.Home>(viewModel); 
     Assert.IsTrue(viewModel.FeaturedProducts.Count > 0); 
    } 

और मेरे नियंत्रक इसके बारे में पता है परिवेश HttpContextBase उदाहरण आपूर्ति कैश और एप्लीकेशन स्टेट है:

public ActionResult Index() 
    {       
     string cacheKey = string.Format("FeaturedProducts-{0}",WebsiteId); 
     IList<Product> productList = this.HttpContext.Cache[cacheKey] as IList<Product>; 


     //My app keeps a list of website contexts in the Application. This test returns 1 based on the unit/int tests or a real world db value when hosted on IIS etc.. 
     int websiteId = (int)HttpContext.Application[this.Request.Url.Host];