2009-12-09 10 views
26

मैंने स्टैक ओवरफ्लो की खोज की है और चार घंटों में गुगल किया है और अभी भी मेरी "छोटी" समस्या के लिए कोई समाधान नहीं मिला है।मैं एक नियंत्रक विधि का परीक्षण कैसे करूं जिसमें [प्राधिकरण] विशेषता लागू होती है?

यदि आप अपने फ़िल्टर किए गए [Authorize] ActionResult के लिए यूनिट परीक्षण लिखते हैं, तो आप नकली में समस्या को कैसे हल करते हैं जिसे उपयोगकर्ता प्रमाणित किया जाता है?

मैं ActionResult तरीकों कि [Authorize] साथ फ़िल्टर्ड रहे हैं की एक बहुत कुछ है और मैं अगर वे [Authorize] या नहीं के साथ फ़िल्टर्ड रहे हैं, भले ही मेरी ActionResult तरीकों के सभी परीक्षण करना चाहते हैं।

मैं क्या मतलब है की एक साधारण उदाहरण:

[TestMethod] 
public void Create_Get_ReturnsView() 
{ 
// Arrange 
var controller = new UserController(); 
// Act 
var result = controller.Create(); 
// Assert 
Assert.IsNotNull(result as ViewResult); 
} 

[Authorize] 
public ActionResult Create() 
{ 
return View("Create"); 
} 

फिलहाल परीक्षण भी [अधिकृत] फिल्टर, फेंका अपवाद की वजह से ActionResult विधि मारा नहीं है: System.NullReferenceException: Object reference not set to an instance of an object.

+1

ऐसा कुछ है जो आप हमें नहीं दिखा रहे हैं। आपके द्वारा दिखाया गया परीक्षण * किसी भी * एक्शन फ़िल्टर निष्पादित नहीं करेगा। हो सकता है आपके पास कोड होगा जो कि होगा, लेकिन यह आपके प्रश्न में नहीं है। शुरुआत के लिए त्रुटि के लिए पूरे कॉल स्टैक के बारे में कैसे? –

उत्तर

25

आप अपने नियंत्रक के लिए एक संदर्भ नकल करने की जरूरत है। Moq

का उपयोग कर अपनी व्यवस्था तो कैसा लगेगा प्रयास करें:

var controller = new UserController(); 
var mock = new Mock<ControllerContext>(); 
mock.SetupGet(x => x.HttpContext.User.Identity.Name).Returns("SOMEUSER"); 
mock.SetupGet(x => x.HttpContext.Request.IsAuthenticated).Returns(true); 
controller.ControllerContext = mock.Object; 

तब आप अपने अधिनियम & दावा करूँ में सक्षम होना चाहिए।

यदि आप पहले से नहीं हैं, तो मैं अत्यधिक उदाहरण के लिए NerdDinner को एमवीसी साइट के रूप में देखने की अनुशंसा करता हूं।

+0

Awsome, यह निर्दोष काम किया ... बहुत बहुत धन्यवाद – Webking

+0

मैं तर्क दे सकता हूं कि आपको वास्तव में इसका परीक्षण करने की आवश्यकता नहीं है। एएसपी.नेट एमवीसी लिखने वाली टीम ने इस विशेषता का पहले ही परीक्षण किया है। आप स्रोत डाउनलोड कर सकते हैं और खुद के लिए देख सकते हैं। –

+8

यह '[अधिकृत]' विशेषता का परीक्षण नहीं करना है, इसे 'ActionResult' विधियों का परीक्षण करने के लिए आसपास जाना है – AndyMcKenna