2011-12-19 18 views
14

एक नियंत्रक मेरी ASP.NET MVC आवेदन में काफी सीधे आगे नियमों के एक जोड़े के अनुसार मेरे विचार से प्रदर्शित प्रपत्र डेटा पूर्व भरता है।यूनिट टेस्टिंग MVC नियंत्रकों

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

कोई इस दृष्टिकोण के तरीकों का सुझाव कर सकते हैं?

सभी उदाहरण मैं इकाई परीक्षण नियंत्रकों के मिल गया है बहुत तुच्छ लग रहा था, जैसे कि पुष्टि करने के रूप में यह देखने की उम्मीद प्रकार लौट आए। मुझे यकीन है कि मैं भी उस में मूल्य देख नहीं हूँ।

उत्तर

21

आप उचित वर्ग में लौटे वस्तु कास्टिंग, बजाय डिफ़ॉल्ट परीक्षण करने के लिए अपने आधार वर्ग (जो डिफ़ॉल्ट रूप से दिया जाता है)

उदाहरण के लिए, का उपयोग करके परीक्षण कर सकते हैं AccountController आप चाहते तो कुछ इस तरह:

var controller = new AccountController(); 
var result = controller.LogOn() as ViewResult; 
var model = result.Model as LogOnModel; 

Assert.IsTrue(model.RememberMe); // assuming you "pre-populated" enabled the checkbox 

जांच की जा रही है, तो वापस आ वस्तु सही डेटा से भर जाता है मुझे नहीं लगता है "अप्राकृतिक", या आप इसे दूसरे तरीके से मतलब था?

+1

आह ... 'result.Model' उपयोगी लग रहा है। –

11

मैं सहमत होगा कि दृश्य के प्रकार के परीक्षण के लिए लौट आए कुछ हद तक व्यर्थ होगा। हालांकि, परीक्षण है कि उम्मीद "दृश्य" अपनी सही डेटा के साथ वापस आ गया था एक वैध परीक्षण का मामला IMO होगा।

उदाहरण यहां के लिए एक संपादन नियंत्रक के लिए एक विलक्षण संपादित परीक्षण का मामला है। ध्यान दें, कि इस उदाहरण Moq और Nunit का इस्तेमाल कर रही है, लेकिन है कि एक तरफ यह काफी सीधे आगे है।

ध्यान दें, कि कि ViewResult की उम्मीद दृश्य मॉडल के लिए डाला जाता है और कथनों तो उम्मीद संपर्क के खिलाफ किया जाता है।

टेस्ट:

[Test] 
public void Edit_Get_Should_Lookup_Contact_From_Repository_And_Return_Edit_View() 
{ 
    // arrange 
    var _repository = new Mock<IContactRepository>(); 

    var expectedContact = new Contact 
    { 
     First = "first", 
     Last = "last", 
     Email = "[email protected]" 
    }; 

    var mockContext = new Mock<ControllerContext>(); 
    _repository.Setup(x => x.GetById(It.IsAny<int>())).Returns(expectedContact); 

    var controller = new ContactController(_repository.Object) 
    { 
     ControllerContext = mockContext.Object 
    }; 

    // act 
    var result = controller.Edit(1) as ViewResult; 
    var resultData = (Contact)result.ViewData.Model; 

    // assert 
    Assert.AreEqual("Edit", result.ViewName); 
    Assert.AreEqual(expectedContact.First, resultData.First); 
    Assert.AreEqual(expectedContact.Last, resultData.Last); 
    Assert.AreEqual(expectedContact.Email, resultData.Email); 
} 

नियंत्रक:

[HttpGet] 
public ActionResult Edit(int id) 
{ 
    var contact = _repository.GetById(id); 

    return View("Edit", contact); 
} 
संबंधित मुद्दे