2009-10-29 8 views
5

मुझे Moq का उपयोग करके मॉकिंग से सत्र मान सेट को वापस करने में समस्याएं आ रही हैं। निम्नलिखितमोक मॉकिंग और सत्र मूल्यों को ट्रैक करना

public class TestHelpers 
{ 
public long sessionValue = -1; 
public HttpContextBase FakeHttpContext() 
{ 

    var httpContext = new Mock<HttpContextBase>(); 
    var session = new Mock<HttpSessionStateBase>(); 
    httpContext.Setup(x => x.Session).Returns(session.Object); 
    httpContext.SetupGet(x => x.Session["id"]).Returns(sessionValue); 
    httpContext.SetupSet(x => x.Session["id"] = It.IsAny<long>()) 
     .Callback((string name, object val) => 
     { 
      sessionValue = (long)val; 
     }); 
    } 
} 

जब मैं

var th = new TestHelpers(); 
HttpContextBase httpContext = th.FakeHttpContext(); 

का उपयोग कर कुछ सामान सत्र सेट ऐसा बाहर मूल्य प्राप्त करने के लिए कोशिश [ "आईडी"]

var sessionid = httpContext.Session["id"]; 

sessionid का उपयोग करने के लिए पता चला है -1 हो। लेकिन मैं

th.sessionValue 

का उपयोग कर सेट सत्र मान प्राप्त कर सकता है क्या गलत है? क्या मैं बस मोक के माध्यम से सेट वैल्यू वापस नहीं कर सकता?

उत्तर

11

मुझे अपने स्वयं के प्रश्नों का उत्तर देना बंद करना होगा। ऐसा लगता है कि मैं बहुत तरह सत्र [ "आईडी"] उपहास करने के लिए फिर से इसकी आवश्यकता ...

httpContext.SetupSet(x => x.Session["id"] = It.IsAny<long>()) 
     .Callback((string name, object val) => 
     { 
      sessionValue = (long)val; 
      httpContext.SetupGet(x => x.Session["id"]).Returns(sessionValue); 
     }); 
+0

यह मेरे लिए काम नहीं करता है: @ कोनामीमम सही प्रतीत होता है कि कलकबैक नहीं निकाला जाता है। सही दृष्टिकोण यहां प्रतीत होता है: http://stackoverflow.com/a/2921695/213609 –

2

मोक की Setup विधियां अनुक्रमित गुणों के साथ काम नहीं करती हैं जिनमें स्ट्रिंग इंडेक्स हैं। यहां देखें: How to MOQ an Indexed property

+0

यदि यह काम नहीं करता है तो सत्र ["आईडी"] वापस शून्य नहीं होना चाहिए और -1 नहीं? – sean

+0

इसके अलावा, आपके द्वारा लिंक किए गए प्रश्न का उत्तर यह इंगित करता है कि यह काम करता है? –

1

क्योंकि आप गेटर जो मूल्य द्वारा पारित किया गया था में मूल्य वापस लौट रहे हैं यह है। इसलिए हर बार जब आप गेटटर का आह्वान करते हैं, तो आपको वही मूल्य वापस मिल जाता है।

एक प्रतिनिधि का उपयोग करने के लिए रिटर्न() बदलें, इसलिए इसका मूल्यांकन हर बार किया जाता है। इस तरह आपको हर बार सही मूल्य मिलेगा :)

एक सेटअप सेटअप के अंदर एम्बेडेड सेटअप सेटअप की तुलना में आंखों पर बहुत आसान है।

var _adminctrl = new Moq.Mock<AdminController>(); //AdminController is my MVC controller 

var mock = new Mock<ControllerContext>(); 
mock.Object.Controller = _adminctrl.Object; 
mock.Setup(p => p.HttpContext.Session["UserInfoKey"]).Returns(new ViewModel()); 
//here is the catch, attaching the ControllerContext to your controller 
_adminctrl.Object.ControllerContext = mock.Object; 

आशा है कि यह मदद करता है:

httpContext.SetupSet(x => x.Session["id"] = It.IsAny<long>()) 
     .Callback((string name, object val) => sessionValue = (long)val); 
httpContext.SetupGet(x => x.Session["id"]).Returns(() => sessionValue); 
1

मैं सिर्फ सबसे आसान तरीका है MOQ के साथ यह करने के लिए पता लगाने की कोशिश लंबा समय बिताया, नीचे मेरी कोड की एक प्रति अतीत है कि वास्तव में मेरे लिए काम किया है!

संबंधित मुद्दे