2015-06-27 6 views
5

मेरे पास एकाधिक मॉडल ऑब्जेक्ट्स में कुछ गुणों के लिए समान नियम हैं और मैं उन्हें यूनिट परीक्षणों में कोड डुप्लिकेशन से बचने के लिए कस्टम प्रॉपर्टी वैधताओं के साथ प्रतिस्थापित करना चाहता हूं।यूनिट परीक्षण कैसे करें सरल संपत्ति में वैधता सेट है?

public class IntIdPropertyValidator: PropertyValidator 
{ 
    public IntIdPropertyValidator() 
     : base("Property {PropertyName} should be greater than 0") 
    { 
    } 

    protected override bool IsValid(PropertyValidatorContext context) 
    { 
     var value = (int)context.PropertyValue; 

     return value > 0; 
    } 
} 

और मॉडल सत्यापनकर्ता कक्षा में यह तारों:

public class SomeRequestValidator : AbstractValidator<CreateWordRequest> 
{ 
    public SomeRequestValidator() 
    { 
     RuleFor(x => x.Id).SetValidator(new IntIdPropertyValidator()); 
    } 
} 

परीक्षण करने की कोशिश की:

[Test] 
public void Validate_IdHasValidator_Success() 
{ 
    Init(); 

    validator.ShouldHaveChildValidator(x => x.Id, typeof(IntIdPropertyValidator)); 
} 

लेकिन परीक्षण हमेशा विफल रहता है

मैं अपनी संपत्ति सत्यापनकर्ता है।

तो, मैं परीक्षण कैसे कर सकता हूं कि वैधकर्ता वास्तव में संपत्ति आईडी के लिए सेट है?

उत्तर

6

आप गलत तरीके से ShouldHaveChildValidator का उपयोग कर रहे हैं। Id एक साधारण प्रकार है।

ShouldHaveChildValidator जटिल प्रकारों पर उपयोग किया जा रहा है। (source code भी देखें)

संपत्ति का परीक्षण करने के सही तरीके से वैध वस्तुओं और अवैध वस्तुओं और फिर पारित करने के लिए है varify ShouldNotHaveValidationErrorFor और ShouldHaveValidationErrorFor का उपयोग कर:

[Test] 
public void Should_have_error_when_Id_Is_Ilegal() { 
     validator.ShouldHaveValidationErrorFor(p => p.Id, new CreateWordRequest()); 
} 

[Test] 
public void Should_not_have_error_when_Id_Is_Legal() { 
     validator.ShouldNotHaveValidationErrorFor(p => p.Id, new CreateWordRequest() 
                  { 
                   Id = 7 
                  }); 
} 

संपादित

निम्नलिखित कोड वह सत्यापन करेगा जो आप खोज रहे थे:

[Test] 
public void Validate_IdHasValidator_Success() 
{ 
    var validator = new SomeRequestValidator(); 

    var descriptor = validator.CreateDescriptor(); 
    var matchingValidators = descriptor.GetValidatorsForMember(
       Extensions.GetMember<CreateWordRequest, int>(x => x.Id).Name); 

    Assert.That(matchingValidators.FirstOrDefault(), Is.InstanceOf<IntIdPropertyValidator>()); 

} 

मैं आपको यह बताना चाहता हूं कि आपको उपर्युक्त कोड का उपयोग नहीं करना चाहिए।

जब आप यूटी कक्षा को सत्यापित करते हैं कि कक्षा व्यवहार को नुकसान नहीं पहुंचाया जाएगा।

जब आप कोई कस्टम सत्यापनकर्ता बनाते हैं, आप एक जिम्मेदारी के साथ एक वर्ग बनाने के विशिष्ट मॉडल सत्यापित करने के लिए (-> व्यापार के नियम) ...

Id अपने मूल मॉडल के अनुसार एक व्यापार नियमों के साथ एक सरल प्रकार है । इसलिए आपको मॉडल सत्यापनकर्ता के माध्यम से Id के व्यावसायिक नियमों को सत्यापित करने की आवश्यकता है।

मान लीजिए कि आपके मॉडल में से एक को अचानक बदलने की जरूरत है। इस मामले में आपके पास कोई मान्यता नहीं है कि आपके मौजूदा व्यापार नियमों में से कोई भी नुकसान नहीं पहुंचाएगा (या आप IntIdPropertyValidator के अंदर परिवर्तन करने का निर्णय लेते हैं, इस तरह की चाल कहीं भी प्रभावित होगी, भले ही आप नहीं चाहते थे)।

कस्टम Property Validator बनाना कोड रखरखाव के लिए बहुत अच्छा है, हालांकि परीक्षण मॉडल सत्यापनकर्ता के खिलाफ होना चाहिए।

जटिल प्रकार पर कहानी काफी अलग है:

आमतौर पर जटिल प्रकार के अपने स्वयं के व्यवसाय के नियम हैं। इस मामले में, आपको उनके लिए एक कस्टम सत्यापनकर्ता बनाना होगा, और तब सत्यापित करें कि अभिभावक सत्यापनकर्ता सही सत्यापनकर्ता का उपयोग करता है। सत्यापित करने के लिए एक और बात यह है कि: यदि जटिल प्रकार Null या जटिल नियम हैं जैसे "जब संपत्ति मान एक्स है और फिर जटिल प्रकार की स्थिति वाई है" ...

+0

ठीक है, हाँ, मुझे पता है, और इस तरह मैंने कस्टम सत्यापनकर्ता का स्वयं परीक्षण किया। लेकिन मुद्दा यह है कि अब मैं ऐसा नहीं करना चाहता हूं कि प्रत्येक मॉडल वर्ग के लिए उस वैधता के साथ समर्थक हो। मैं परीक्षण करना चाहता हूं कि क्या वैधकर्ता वास्तव में प्रोप के लिए सेट है, और यदि यह सही काम करता है तो इसका परीक्षण न करें, cuz यही है कि कस्टम सत्यापनकर्ता के परीक्षण क्या करते हैं। – liri2006

+0

@ liri2006 मैंने अपना उत्तर उस सत्यापन के तरीके के साथ अपडेट किया जिसकी आप तलाश कर रहे थे ... मैं यह भी बताता हूं कि आपको ऐसा क्यों नहीं करना चाहिए .... –

+0

यह बेहद सहायक था! कोड और स्पष्टीकरण दोनों। – liri2006

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