2013-07-12 3 views
6

मेरे पास एक विधि है जिसका संचालन इसके आश्रितों पर निर्भर करता है, जैसे नीचे। क्या यह अभी भी इकाई परीक्षण कर रहा है? चूंकि इकाई परीक्षण किसी भी व्यावसायिक तर्क का परीक्षण नहीं कर रहा है, बल्कि मैक्स द्वारा।क्या यूनिट टेस्ट एक बूलियन वैल्यू को स्विच के रूप में स्वीकार करके डबल-ड्यूटी कर सकता है, या क्या मुझे दो अलग-अलग परीक्षण लिखना चाहिए जो परीक्षण कोड को डुप्लिकेट करते हैं?

यूनिट नीचे परीक्षण:

कृपया ध्यान दें कि विधि के opetions expectedCustomerValidality द्वारा निर्धारित किया जाता है, जो परीक्षण के द्वारा सेटअप है। अधिकतर, तर्क mocks से निर्धारित होता है (उदाहरण के लिए Setup(c => c.IsValid())

 [Test] 
     [TestCase(true)] 
     [TestCase(false)] 
     public void AddCustomer(bool expectedCustomerValidality) 
     { 
      //using Moq 
      companyRepositoryMock.Setup(c => c.GetById(It.IsAny<int>())).Returns(new Company());   
      customerValidatorMock.Setup(c => c.IsValid(It.IsAny<Customer>())).Returns(expectedCustomerValidality); 

      var customer = new Customer 
           { 
            Firstname = "firstName", 
            Surname = "surname", 
            Company = new Company { Id = 1 } 
           }; 

      var addCustomer = customerServiceSut.AddCustomer(customer); 

      Assert.AreEqual(expectedCustomerValidality,addCustomer); 
     } 

उत्पादन नीचे कोड:।

public class CustomerService : ICustomerService 
    { 
     private ICompanyRepository companyRepository; 
     private ICustomerRepository customerRepository; 
     private ICustomerValidator customerValidator; 

     public CustomerService(ICompanyRepository companyRepository, ICustomerRepository customerRepository, ICustomerValidator customerValidator) 
     { 
      this.companyRepository = companyRepository; 
      this.customerRepository = customerRepository; 
      this.customerValidator = customerValidator; 

     } 

     public bool AddCustomer(Customer customer) 
     {   
      customer.Company = companyRepository.GetById(customer.Company.Id); ; 

      if (customerValidator.IsValid(customer)) 
      { 
       customerRepository.AddCustomer(customer); 

       return true; 
      } 

      return false; 
     } 
} 

प्रश्न:

  • AddCustomer() की आवश्यकता इकाई परीक्षण है
  • यदि हां, तो वर्तमान इकाई परीक्षण सही तरीके से प्रदर्शन कर रहा है?

    1 यदि नहीं, तो यूनिट परीक्षण करने का उचित तरीका क्या है?

+0

1. गैर-तुच्छ तर्क वाले सभी विधियों को यूनिट परीक्षण किया जाना चाहिए। 2. "सही" से आपका क्या मतलब है? –

+0

1. आपका मतलब है कि AddCustomer में गैर-तुच्छ तर्क शामिल है। लेकिन यह इसकी निर्भरता पर निर्भर करता है, जो मजाक कर रहा है। 2. परीक्षण में, यदि शाखा नकली वस्तु द्वारा निर्धारित की जाती है। – Pingpong

उत्तर

7

मुझे यह पसंद नहीं है। यहाँ क्यों है: अपने परीक्षण विधि के नाम परीक्षण के अंतर्गत विधि को प्रतिबिंबित करना चाहिए, क्या परीक्षण की पूर्व शर्त हैं, और क्या आप परीक्षण के परिणाम की उम्मीद होने के लिए:

public bool AddCustomer_CustomerIsValid_ShouldReturnTrue() 

public bool AddCustomer_CustomerIsInvalid_ShouldReturnFalse() 

अब अगर आप के लिए, आप refactor कर सकते हैं चाहता हूँ कोर डुप्लिकेशन को खत्म करने के लिए कोर परीक्षण तर्क अपनी विधि में तर्क देता है, और फिर उस विधि को दो उपरोक्त तरीकों से कॉल करता है। लेकिन refactored विधि एक परीक्षण मामला नहीं है; यह वास्तविक परीक्षण मामलों के लिए सिर्फ एक सहायक विधि है।

उदाहरण:

[Test] 
public void AddCustomer_CustomerIsValid_ShouldReturnTrue() 
{ 
    var result = AddCustomerTest(true); 
    Assert.IsTrue(result); 
} 

[Test] 
public void AddCustomer_CustomerIsInvalid_ShouldReturnFalse() 
{ 
    var result = AddCustomerTest(false); 
    Assert.IsFalse(result); 
} 

public void AddCustomerTest(bool expectedCustomerValidality) 
{ 
    //using Moq 
    companyRepositoryMock.Setup(c => c.GetById(It.IsAny<int>())).Returns(new Company());   
    customerValidatorMock.Setup(c => c.IsValid(It.IsAny<Customer>())).Returns(expectedCustomerValidality); 

    var customer = new Customer 
    { 
     Firstname = "firstName", 
     Surname = "surname", 
     Company = new Company { Id = 1 } 
    }; 

    var result= customerServiceSut.AddCustomer(customer); 

    return result; 
} 
+1

+1 .. यूनिट परीक्षण को रिफैक्टरिंग/क्लीनअप से बाहर नहीं रखा गया है। –

+0

क्या आप इस पर विस्तार कर सकते हैं, कोई उदाहरण? – Pingpong

+0

@ पिंगपोंग: आपका 'AddCustomer (बूल अपेक्षित ग्राहक Validality)' अब एक परीक्षण विधि नहीं है। इसके बजाए, यह दोहराया गया तरीका है कि उपरोक्त दो परीक्षण विधियों को कॉल करें। रिफैक्चरर्ड विधि में एक बूल लौटें, और जोर दें कि दो परीक्षण विधियों में से प्रत्येक में वापसी मूल्य सही है।मेरा अद्यतन उत्तर देखें। –

0

AddCustomer परीक्षण की आवश्यकता है, क्योंकि यह एक व्यापार तर्क करता है - यह एक कंपनी प्राप्त करता है, और यह सेट करता है, यह डेटा की पुष्टि करता है, यह भंडार करने के लिए डेटा कहते हैं, और यह एक रिटर्न परिणाम।

आपका परीक्षण लगभग सही है। मैं इसे थोड़ा और अधिक विशिष्ट, सभी व्यापार तर्क सत्यापित करने के लिए करना होगा:

[Test] 
[TestCase(true)] 
[TestCase(false)] 
public void AddCustomer(bool isCustomerValid) 
{ 
    //arrange 
    //NOTE!!! create the mocks with MockBehavior.Strict 
    //that way the test will fail if a call is made w/o setup 

    const long testCompanyId = 100; 
    var testCompany = new Company{ Id = testCompanyId }; 
    companyRepository.Setup(r => r.GetById(testCompanyId)) 
      .Returns(testCompany); 

    var testCustomer = new Customer 
        { 
         Firstname = "firstName", 
         Surname = "surname", 
         Company = new Company { Id = testCompanyId } 
        }; 

    customerValidatorMock.Setup(c => c.IsValid(It.Is<Customer>(c => c == testCustomer && c.Company == testCompany)).Returns(isCustomerValid); 

    if (isCustomerValid) 
    { 
      customerRepository.Setup(r => r.AddCustomer(testCustomer)). Verifiable(); 
    } 

    //act   
    var addCustomerResult = customerServiceSut.AddCustomer(testCustomer); 

    //assert 
    Assert.AreEqual(isCustomerValid, addCustomerResult); 
    cutomerRepository.VerifyAll(); 
} 

ऊपर परीक्षण करता है, तो कंपनी आईडी द्वारा दिलवाया जाता है और, यदि प्राप्त किए गए, सेवा विधि के सभी कार्यक्षमता का परीक्षण होगा एक प्रयोग किया जाता है। साथ ही, यह सत्यापित होगा कि क्या ग्राहक जोड़ा गया है, यदि यह मान्य है। परीक्षण विफल हो जाएगा, यदि ग्राहक वैध नहीं है, तो ग्राहक के रूप में जोड़ा गया है (ग्राहक के रूप में mockBehavior.Strict के साथ बनाया गया है, और एक सेटअप नहीं किया जाएगा)।

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

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