2016-07-12 7 views
10

मैं अपने नियंत्रक कोड का परीक्षण करने की कोशिश कर रहा हूं जो दावा प्रिंसिपल से जानकारी प्राप्त करता है। वर्तमान। नियंत्रक कोड में मैंनकली दावों में दावों को कैसे जोड़ें दावे प्रिंसिपल

public class HomeController { 
    public ActionResult GetName() { 
     return Content(ClaimsPrincipal.Current.FindFirst("name").Value); 
    } 
} 

और मैं दावे के साथ मेरी ClaimsPrincipal उपहास करने के लिए कोशिश कर रहा हूँ लेकिन मैं अभी भी दावे से किसी भी नकली मूल्य नहीं है।

// Arrange 
IList<Claim> claimCollection = new List<Claim> 
{ 
    new Claim("name", "John Doe") 
}; 

var identityMock = new Mock<ClaimsIdentity>(); 
identityMock.Setup(x => x.Claims).Returns(claimCollection); 

var cp = new Mock<ClaimsPrincipal>(); 
cp.Setup(m => m.HasClaim(It.IsAny<string>(), It.IsAny<string>())).Returns(true); 
cp.Setup(m => m.Identity).Returns(identityMock.Object); 

var sut = new HomeController(); 

var contextMock = new Mock<HttpContextBase>(); 
contextMock.Setup(ctx => ctx.User).Returns(cp.Object); 

var controllerContextMock = new Mock<ControllerContext>(); 
controllerContextMock.Setup(con => con.HttpContext).Returns(contextMock.Object); 
controllerContextMock.Setup(con => con.HttpContext.User).Returns(cp.Object); 

sut.ControllerContext = controllerContextMock.Object; 

// Act 
var viewresult = sut.GetName() as ContentResult; 

// Assert 
Assert.That(viewresult.Content, Is.EqualTo("John Doe")); 

व्यूअरल्ट। सामग्री यूनिट परीक्षण चलाने के बाद खाली है। अगर मैं नकली दावा जोड़ सकता हूं तो कोई मदद। धन्यवाद।

उत्तर

15

पहले, आप अपने परीक्षण में इस लाइन याद कर रहे हैं:

Thread.CurrentPrincipal = cp.Object; 

(और फिर टियरडाउन में यह सफाई)।

दूसरा, जैसा कि @trailmax का उल्लेख है, मुख्य वस्तुओं का मज़ाकिया अव्यवहारिक है। आपके मामले में, ClaimsPrincipal.FindFirst (विघटित स्रोत के अनुसार) इसके उदाहरण के निजी क्षेत्रों में दिखता है, यही वजह है कि मॉकिंग ने मदद नहीं की।

मैं दो सरल वर्गों है कि मुझे इकाई परीक्षण करने की अनुमति का उपयोग करना पसंद दावों के आधार पर कार्यक्षमता:

public class TestPrincipal : ClaimsPrincipal 
    { 
     public TestPrincipal(params Claim[] claims) : base(new TestIdentity(claims)) 
     { 
     } 
    } 

    public class TestIdentity : ClaimsIdentity 
    { 
     public TestIdentity(params Claim[] claims) : base(claims) 
     { 
     } 
    } 

तो अपने परीक्षण के लिए नीचे सिकुड़ता है:

[Test] 
    public void TestGetName() 
    { 
     // Arrange 
     var sut = new HomeController(); 
     Thread.CurrentPrincipal = new TestPrincipal(new Claim("name", "John Doe")); 

     // Act 
     var viewresult = sut.GetName() as ContentResult; 

     // Assert 
     Assert.That(viewresult.Content, Is.EqualTo("John Doe")); 
    } 

और यह अब से गुजरता है, मैंने बस सत्यापित

+0

धन्यवाद! मुझे लगता है कि मैं इसे जटिल बना रहा था। तो हमें वास्तव में 'दावा प्रिंसिपल' का नकल करने की आवश्यकता कब होती है? जब से मैं Google पर जांच करता हूं, तब से कई लोग 'दावा प्रिंसिपल' का मज़ाक उड़ा रहे हैं। इस तरह, http://stackoverflow.com/questions/14190066/is-there-any-way-i-can-mock-a-claims-principal-in-my-asp-net-mvc-web- appplication। – Henry

+0

आपका स्वागत है :) उस उत्तर में, धारणा है कि एसयूटी केवल हैस्क्लेम विधि को कॉल करेगा, बहुत नाजुक है। यदि एक दिन SUT (शायद तीसरे पक्ष कोड) को प्रिंसिपल के अतिरिक्त सदस्यों तक पहुंचने की आवश्यकता है, तो परीक्षण टूट जाएगा। मैं प्रायः निर्भरताओं को मैन्युअल रूप से उप-वर्गीकरण करना और उन्हें "परीक्षण मार्ग" में लागू करना पसंद करता हूं, जबकि मुझे लगता है कि वे अभी भी लगातार व्यवहार करते हैं। –

+0

शानदार! मेरे लिए पूरी तरह से काम किया। धन्यवाद! –

13

आप ClaimsPrincipal यह नहीं बाहर निर्भरता है नकली की जरूरत नहीं है और आपके द्वारा बनाए कर सकते हैं यह गैर-मज़ाक उड़ाया:

var claims = new List<Claim>() 
{ 
    new Claim(ClaimTypes.Name, "username"), 
    new Claim(ClaimTypes.NameIdentifier, "userId"), 
    new Claim("name", "John Doe"), 
}; 
var identity = new ClaimsIdentity(claims, "TestAuthType"); 
var claimsPrincipal = new ClaimsPrincipal(identity); 

और मुझे यकीन है कि आप यहां क्या परीक्षण कर रहे हैं नहीं कर रहा हूँ। निश्चित रूप से "जॉन डो" viewResult.Content का हिस्सा नहीं होगा क्योंकि इसे कभी भी सेट नहीं किया गया है।

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