2014-10-06 9 views
6

में प्रस्तुत किया गया है, मैं एक एप्लिकेशन के लिए यूनिट परीक्षण लिख रहा हूं और यह जांचना चाहता हूं कि UIAlertController किसी विशिष्ट परिदृश्य में प्रस्तुत किया गया है या नहीं।जांचें कि क्या UIAlertController को XCTest केस

-(void)testBadLogin { 
    // enter username and password in UITextFields 
    self.viewController.usernameField.text = @"[email protected]"; 
    self.viewController.passwordField.text = @"incorrect_pass"; 
    [loginButton sendActionsForControlEvents: UIControlEventTouchUpInside]; 

    // this isn't right 
    XCTAssertNotNil([self.viewController alertController], @"alertController should appear"); 
} 

मैं कैसे देख सकता हूं कि वर्तमान दृश्य के शीर्ष पर UIAlertController प्रस्तुत किया गया है या नहीं?

उत्तर

5

"। XCTest UI घटक परीक्षण करने के लिए इस्तेमाल किया जा करने के लिए होती नहीं है" वास्तव में सटीक नहीं है। मैं लगभग हर यूआई परीक्षण के लिए एक्ससीटीएस्ट का उपयोग कर रहा हूं और यह ठीक काम करता है। सही जवाब "मॉकिंग" होगा।

मैं परीक्षण दृश्य नियंत्रक को मॉक करने के लिए ओसीएमॉक का उपयोग करता हूं और "सत्यापित" करता हूं कि विधि मौजूद दृश्य नियंत्रक ... को चेतावनी नियंत्रक के साथ बुलाया जाता है। यह एक साफ समाधान है और ठीक काम करता है। (आप यह भी अनदेखा कर सकते हैं कि अलर्ट कंट्रोलर इस विधि को पास कर दिया गया है और केवल यह जांचें कि व्यू कंट्रोलर को विधि को पास किया गया है व्यू कंट्रोलर ...)

-2

XCTest का उपयोग यूआई घटकों का परीक्षण करने के लिए नहीं किया जाना है।

उपयोग एप्पल के UIAutomation जावास्क्रिप्ट इस के लिए लाइब्रेरी: परीक्षण अलर्ट के लिए

https://developer.apple.com/library/ios/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/UsingtheAutomationInstrument/UsingtheAutomationInstrument.html#//apple_ref/doc/uid/TP40004652-CH20

डॉक्स: https://developer.apple.com/library/ios/documentation/ToolsLanguages/Reference/UIAAlertClassReference/index.html#//apple_ref/doc/uid/TP40009898

+3

कई उपयोगकर्ता (और मैं स्वयं को शामिल करता हूं) यह सत्यापित करना चाहता हूं कि किसी फ़ंक्शन पर कोई अलर्ट कहलाया गया हो जिसे हम परीक्षण कर रहे हैं। यह यूआई घटकों का परीक्षण नहीं कर रहा है, यह सिर्फ यह सुनिश्चित कर रहा है कि कार्यक्षमता वहां है। मॉकिंग यह है कि इसके लिए क्या इस्तेमाल किया जाना चाहिए। –

0

मैंने आसान यूनिट परीक्षण के लिए यूआईएलर्ट कंट्रोलर के चारों ओर एक रैपर लिखा है।

आप देख सकते हैं यह दिखाई

XCTAssert(testableAlert.visible) 

है और तुम भी उसके कार्यों

testableAlert.simulateAction("OK") 

https://github.com/exchangegroup/TestableAlert

0

यह भी इस तरह से किया जा सकता है पर अमल कर सकते हैं:

आइए मान लें कि हमारे पास एक बटन है जो टैप किए जाने पर दिखाता है नियंत्रक देखें:

- (void) didTapButton 
{ 
    UIAlertController* c = [UIAlertController alertControllerWithTitle:@"Title" message:@"Message" 
                 preferredStyle:UIAlertControllerStyleAlert]; 
    [self presentViewController:c animated:ANIMATED completion:nil]; 
} 

ध्यान दें कि एनिमेटेड पैरामीटर 'हां' या 'नहीं' है। यह प्रीफिक्स हैडर में परिभाषित किया गया है:

#define ANIMATED (getenv("runningTests") == NULL) 

और रनटेस्ट टेस्ट लक्ष्य में पर्यावरण चर परिभाषित किया गया है। यूनिट/एकीकरण परीक्षण निष्पादित करते समय हम एनीमेशन नहीं चाहते हैं।

परीक्षा पद्धति लगता है:

- (void) testButtonWillShowAlertView 
{ 
    UIApplication.sharedApplication.delegate.window.rootViewController = controller; 
    [controller.button sendActionsForControlEvents:UIControlEventTouchUpInside]; 
    XCTAssertEqualObjects(controller.presentedViewController.class, UIAlertController.class); 
} 

महत्वपूर्ण रेखा है

UIApplication.sharedApplication.delegate.window.rootViewController = controller; 

Apparentely, UIWindow पर rootViewController स्थापित किया जाना है।

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