2011-09-05 15 views
5

मैं ओसीएमॉक के साथ वास्तविक वेब सेवा कॉल का परीक्षण कर रहा हूं।विलंबित ओसीएमॉक यूनिट टेस्ट में टाइमआउट के साथ सत्यापित/लेनदेन

अभी मैं कुछ की तरह कर रहा हूँ:

- (void)testWebservice 
{ 
    id mydelegatemock = [OCMockObject mockForProtocol:@protocol(MySUTDelegate)]; 
    [[mydelegatemock expect] someMethod:[OCMArg any]]; 

    [SUT sutWithDelegate:mydelegatemock]; 

    // we need to wait for real result 
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:2.0]]; 

    [(OCMockObject*)mydelegatemock verify]; 
} 

यह ठीक काम करता है, लेकिन यह संकेत मिलता है कि हर तरह के परीक्षण 2 सेकंड का समय लगेगा।

क्या कोई तरीका है कि मैं एक टाइमआउट सेट कर सकता हूं उदा। 2 सेकंड, और पर mydelegatemock पर तुरंत verify पर कॉल करें और परीक्षण केस पूरा करें?

उत्तर

5

मैं क्या यह एक आसान उपयोगिता समारोह मैं at this link पाया का उपयोग कर: बिना

#import "TestUtils.h" 
@implementation TestUtils 

+ (void)waitForVerifiedMock:(OCMockObject *)inMock delay:(NSTimeInterval)inDelay 
{ 
    NSTimeInterval i = 0; 
    while (i < inDelay) 
    { 
     @try 
     { 
      [inMock verify]; 
      return; 
     } 
     @catch (NSException *e) {} 
     [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.5]]; 
     i+=0.5; 
    } 
    [inMock verify]; 
} 

@end 

यह मैं एक अधिकतम देरी तक प्रतीक्षा करनी को (सेकंड में) की अनुमति देता है:

#import <Foundation/Foundation.h> 
#import <OCMock/OCMock.h> 

@interface TestUtils : NSObject 
+ (void)waitForVerifiedMock:(OCMockObject *)mock delay:(NSTimeInterval)delay; 
@end 

और कार्यान्वयन हर बार पूर्ण राशि का इंतजार।

+2

शायद यहां जन्म लिया मिल सकती है? ... http://touchalicious.com/blog/2009/11/5/asynchronous-unit-testing-with-ocmock.html –

+1

धन्यवाद मैक्स - यह स्रोत की तरह दिखता है। मैंने मूल के लिंक के साथ मूल प्रतिक्रिया अद्यतन की है। –

1

मैं आपकी सेवा सेवाओं की प्रक्रियाओं को संसाधित करता हूं जो आपकी कक्षा के यूनिट परीक्षण से आपकी वेब सेवाओं के कार्यात्मक परीक्षण को अलग करेगा (यदि आपको ऐसा करने की ज़रूरत है)।

इकाई परीक्षण के लिए, आपको नकली परिणाम प्रदान करने, वेब सेवा कॉल का नकल करना चाहिए। फिर आपका परीक्षण यह सत्यापित करेगा कि, उस अच्छी तरह से परिभाषित परिणाम के लिए, आपकी कक्षा तदनुसार व्यवहार करती है।

यदि आप अपनी वेब सेवा का कार्यात्मक परीक्षण भी करना चाहते हैं (कहें कि यह कुछ अनुरोध दिए गए एक विशिष्ट प्रतिक्रिया देता है), तो आपको कुछ भी नकल करने की आवश्यकता नहीं है - केवल सेवा पर कॉल करें और परिणाम पर दावा करें।

अपने परीक्षणों को अलग करके, आपके पास परीक्षण रनों पर बेहतर नियंत्रण होता है। उदाहरण के लिए, जब भी आप कोड बदलते हैं, तो आप अपने फास्ट-रनिंग यूनिट परीक्षण चला सकते हैं, लेकिन समर्पित सर्वर पर, या आवश्यकतानुसार, धीमे चलने वाले कार्यात्मक परीक्षणों को रात में चलाएं। और जब एक परीक्षण टूट जाता है, तो आपको पता चलेगा कि यह आपका कोड है या वेब सेवा के साथ कुछ गलत है।

+2

मेरे पास पहले से ही वेब सेवा से नकली रिटर्न के साथ डिब्बाबंद परीक्षण हैं। यह सवाल वास्तविक वेब सेवा के साथ एकीकरण परीक्षण के बारे में था। मैं मानता हूं कि मैं उन लोगों में आवेदन भाग को छोड़ सकता हूं, लेकिन यह इस तथ्य को नहीं बदलेगा कि मुझे किसी भी तरह के परिणाम की प्रतीक्षा करनी है। और: डिब्बाबंद परिणामों के साथ, मैं डिब्बाबंद परिणामों के साथ अनुरोध और परिणाम के बीच विलंबता का परीक्षण नहीं करता हूं, परिणाम प्रतिनिधि को वास्तव में * कॉल * समाप्त होने के पहले * कहा जाता है। – fabb

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