2014-06-11 11 views
5

मैं अपने एपी कंट्रोलर परीक्षण में उपयोगकर्ता की नकल करने की कोशिश कर रहा हूं। Set User property for an ApiController in Unit Test उपयोगकर्ता गुण सेट करने के लिए:यूनिट टेस्ट वेब एपीआई 2 मॉक उपयोगकर्ता

[Route(Urls.CustInfo.GetCustomerManagers)] 
    public HttpResponseMessage GetCustomerManagers([FromUri]int groupId = -1) 
    { 
     var user = User.Identity.Name; 
     if (IsStaff(user) && groupId == -1) 
     { 
      return ErrorMissingQueryStringParameter; 
     } 
     ... 
    } 

मैं इस पोस्ट में सुझाव का पालन किया:

यह मेरा api विधि है।

[TestMethod] 
    public void User_Without_Group_Level_Access_Call_GetCustomerManagers_Should_Fail() 
    { 
     Thread.CurrentPrincipal = new GenericPrincipal(new GenericIdentity("Bob", "Passport"), new[] {"managers"}); 
     var response = m_controller.GetCustomerManagers(); 

     Assert.AreEqual(HttpStatusCode.BadRequest, response.StatusCode); 
    } 

लेकिन जब परीक्षण चलाया जाता है, उपयोगकर्ता संपत्ति हमेशा रिक्त है:

यह मेरी परीक्षा है।

मैंने उपयोगकर्ता को कॉल करने से पहले केवल वर्तमान प्रिंसिपल को एपीआई विधि में सेट करने के लिए लाइन को स्थानांतरित करने का प्रयास किया। इडेंटिटी, लेकिन यह अभी भी शून्य है।

मैं क्या गलत कर रहा हूं? यदि यह दृष्टिकोण वेब एपीआई 2 के लिए काम नहीं करता है, तो उपयोगकर्ता संपत्ति को अनुकरण/नकल करने का सबसे अच्छा तरीका क्या है?

धन्यवाद!

उत्तर

13

आप ControllerContext.RequestContext.Principal में उपयोगकर्ता सेट कर सकते हैं:

controller.ControllerContext.RequestContext.Principal = new GenericPrincipal(new GenericIdentity("Bob", "Passport"), new[] {"managers"}); 

या एक आशुलिपि बराबर:

controller.User = new GenericPrincipal(new GenericIdentity("Bob", "Passport"), new[] {"managers"}); 
+1

इस तरह प्रिंसिपल को स्थापित करने के बाद, UserId सेट नहीं है। मुझे इसे सेट करने की आवश्यकता है क्योंकि मेरे सिस्टम-अंडर-टेस्ट में तर्क उपयोगकर्ता आईडी पर आधारित है। जैसे 'User.Identity.Name' भर गया है (" बॉब ") लेकिन' User.Identity.GetUserId() 'नहीं। – Bart

+0

@ बार्ट क्या आपने कभी इसे हल किया है? –

+0

@ बेन हॉल यह थोड़ी देर हो गया है, लेकिन मुझे नहीं लगता कि मैंने किया था। मुझे लगता है कि मेरा वर्कअराउंड सिर्फ 'UserId' के बजाय' उपयोगकर्ता नाम 'का उपयोग करने के लिए तर्क को बदलना था। – Bart

4

वेब एपीआई 2 की आसान इकाई परीक्षण के लिए, आप MyTested.WebApi उपयोग कर सकते हैं।

MyWebApi 
    .Controller<WebApiController>() 
    .WithAuthenticatedUser(user => user.WithUsername("NewUserName")) 
    .Calling(c => c.SomeAction()) 
    .ShouldReturn() 
    .Ok(); 
0

मैं कुछ वास्तव में स्थापित करने के लिए इस को हल करने के() के रूप में सबसे अधिक वोट के साथ जवाब में दिए गए उपयोगकर्ता नाम का विरोध करने के लिए GetUserId वापस जाने के लिए प्रबंधन कैसे किया: यहाँ प्रमाणीकृत उपयोगकर्ता के साथ एक उदाहरण है। क्षमा करें कि ओयू को आपकी पसंद के मॉकिंग टूल पर FakeItEasy के उपयोग से अनुवाद करना होगा।

Claim claim = new Claim("", userId); 
ClaimsIdentity fakeClaimsIdentity = A.Fake<ClaimsIdentity>(); 
A.CallTo(() => fakeClaimsIdentity.FindFirst(A<string>.Ignored)).Returns(claim); 

IPrincipal fakeIPrincipal = A.Fake<IPrincipal>(); 
A.CallTo(() => fakeIPrincipal.Identity).Returns(fakeClaimsIdentity); 

var controller = new AuthorisedServicesController() 
{ 
     User = fakeIPrincipal 
}; 

हालांकि एक बेहतर समाधान (अगर मैं कोड फिर से लिख रहा था) सार होगा वास्तविक कोड GetUserId बुला तो मैं तो एक वस्तु है कि कॉल कर सकते हैं इंजेक्षन कर सकते हैं, यह आसानी से mockable जा रहा है। एक कारखाने की तरह थोड़ा।

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