moq

2009-04-16 12 views
40

का उपयोग कर Controller.User नकली कैसे मुझे लगता है कि इसmoq

bool isAdmin = User.IsInRole("admin"); 

कि शर्त पर आसानी से अभिनय की तरह अपनी भूमिका के लिए Controller.User प्रश्नों ActionMethods की एक जोड़ी है।

मैं इस

[TestMethod] 
public void HomeController_Index_Should_Return_Non_Null_ViewPage() 
{ 
    HomeController controller = new HomePostController(); 
    ActionResult index = controller.Index(); 

    Assert.IsNotNull(index); 
} 

की तरह कोड के साथ इन तरीकों के लिए परीक्षण करने के लिए शुरू कर रहा हूँ और है कि टेस्ट विफल क्योंकि Controller.User सेट नहीं है। कोई विचार?

उत्तर

65

आपको कंट्रोलर कॉन्टेक्स्ट, एचटीपी कोंटेक्स्टबेस और अंततः आईप्रिन प्रिंसल को नियंत्रक पर उपयोगकर्ता संपत्ति का नकल करने की आवश्यकता है। निम्नलिखित लाइनों के साथ Moq (v2) का उपयोग करना चाहिए।

[TestMethod] 
    public void HomeControllerReturnsIndexViewWhenUserIsAdmin() { 
     var homeController = new HomeController(); 

     var userMock = new Mock<IPrincipal>(); 
     userMock.Expect(p => p.IsInRole("admin")).Returns(true); 

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

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

     homeController.ControllerContext = controllerContextMock.Object; 
     var result = homeController.Index(); 
     userMock.Verify(p => p.IsInRole("admin")); 
     Assert.AreEqual(((ViewResult)result).ViewName, "Index"); 
    } 

व्यवहार उपयोगकर्ता व्यवस्थापक नहीं है जब परीक्षण उम्मीद झूठी वापस जाने के लिए userMock वस्तु पर सेट को बदलने के रूप में सरल है।

+8

Moq के नवीनतम संस्करण में, ExpectGet SetupGet ने ले लिया है। – Slider345

+0

यदि आप नियंत्रक के निर्माता में दावा प्रिंसिपल का उपयोग कर रहे हैं तो ऐसा करने का कोई तरीका? – russelrillema

20

Moq संस्करण 3.1 (और NUnit) का उपयोग करना: जब परीक्षण की स्थापना HttpContext के लिए नकली बनाने के लिए कोई जरूरत नहीं है

[Test] 
    public void HomeController_Index_Should_Return_Non_Null_ViewPage() 
    { 
     // Assign: 
     var homeController = new HomeController(); 

     Mock<ControllerContext> controllerContextMock = new Mock<ControllerContext>(); 
     controllerContextMock.Setup(
      x => x.HttpContext.User.IsInRole(It.Is<string>(s => s.Equals("admin"))) 
      ).Returns(true); 
     homeController.ControllerContext = controllerContextMock.Object; 

     // Act: 
     ActionResult index = homeController.Index(); 

     // Assert: 
     Assert.IsNotNull(index); 
     // Place other asserts here... 
     controllerContextMock.Verify(
      x => x.HttpContext.User.IsInRole(It.Is<string>(s => s.Equals("admin"))), 
      Times.Exactly(1), 
      "Must check if user is in role 'admin'"); 
    } 

ध्यान दें कि, Moq संपत्तियों की नेस्टिंग का समर्थन करता है।