लोग,
मैं संसाधित करने और एक UIAlertView में परिणाम देने के आईओएस ग्राहक के लिए HTTP अनुरोध भेज कर इस को हल करने के लिए कर रहा था। ध्यान दें कि सभी आईओएस कोड संशोधन #if DEBUG सशर्त संकलन निर्देशों में लिपटे हैं।
सबसे पहले, अपने ग्राहक को डिवाइस शेक की स्थिति में अधिसूचनाएं भेजने के लिए सेट करें। Read this post for more information।
इसके बाद, अपने आईओएस मुख्य अनुप्रयोग प्रतिनिधि में इस कोड जोड़ें:
- (void) deviceShakenShowDebug:(id)sender
{
if (!self.textFieldEnterDebugArgs)
{
self.textFieldEnterDebugArgs = [[[UITextField alloc] initWithFrame:CGRectMake(0, 0, 260.0, 25.0)] autorelease];
self.textFieldEnterDebugArgs.accessibilityLabel = @"AlertDebugArgsField";
self.textFieldEnterDebugArgs.isAccessibilityElement = YES;
[self.textFieldEnterDebugArgs setBackgroundColor:[UIColor whiteColor]];
[self.tabBarController.selectedViewController.view addSubview:self.textFieldEnterDebugArgs];
[self.tabBarController.selectedViewController.view bringSubviewToFront:self.textFieldEnterDebugArgs];
}
else
{
if ([self.textFieldEnterDebugArgs.text length] > 0)
{
if ([self.textFieldEnterDebugArgs.text hasPrefix:@"http://"])
{
[self doDebugHttpRequest:self.textFieldEnterDebugArgs.text];
}
}
}
}
- (void)requestDidFinishLoad:(TTURLRequest*)request
{
NSString *response = [[[NSString alloc] initWithData:((TTURLDataResponse*)request.response).data
encoding:NSUTF8StringEncoding] autorelease];
UIAlertView *resultAlert =
[[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Request Loaded",@"")
message:response
delegate:nil
cancelButtonTitle:NSLocalizedString(@"OK",@"")
otherButtonTitles:nil] autorelease];
resultAlert.accessibilityLabel = @"AlertDebugResult";
[resultAlert show];
}
इस कोड को बहुत शीर्ष करने के लिए एक UITextField जोड़ देगा:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(deviceShakenShowDebug:)
name:@"DeviceShaken"
object:nil];
फिर एक विधि है कि कुछ इस तरह दिखता जोड़ने किसी भी नेविगेशन बार या अन्य UI तत्व के ठीक ऊपर थप्पड़ मारने के बाद नियंत्रक को देखें। UIAutomation, या आप उपयोगकर्ता, मैन्युअल रूप से इस UITextField में एक यूआरएल दर्ज कर सकते हैं। जब आप डिवाइस को फिर से हिलाते हैं, यदि पाठ "http" से शुरू होता है तो यह कोड में HTTP अनुरोध जारी करेगा (पाठक को doDebugHttpRequest को लागू करने के लिए व्यायाम)।
फिर, मेरी UIAutomation JavaScript फ़ाइल में, मैं निम्नलिखित दो कार्यों को परिभाषित किया है: मेरे जावास्क्रिप्ट फ़ाइल में
function httpGet(url, delayInSec) {
if (!delayInSec) delay = 1;
var alertDebugResultSeen = false;
var httpResponseValue = null;
UIATarget.onAlert = function onAlert(alert) {
httpResponseValue = alert.staticTexts().toArray()[1].name();
alert.buttons()[0].tap();
alertDebugResultSeen = true;
}
var target = UIATarget.localTarget();
var application = target.frontMostApp();
target.shake(); // bring up the input field
application.mainWindow().textFields()["AlertDebugArgsField"].setValue(url);
target.shake(); // send back to be processed
target.delay(delayInSec);
assertTrue(alertDebugResultSeen);
return httpResponseValue;
}
function httpGetJSON(url, delayInSec) {
var response = httpGet(url, delayInSec);
return eval('(' + response + ')');
}
अब, मैं
httpGet('http://localhost:3000/do_something')
कॉल कर सकते हैं और यह निष्पादित करेंगे एक HTTP निवेदन। मैं JSON डेटा सर्वर से वापस चाहते हैं, मैं
var jsonResponse = httpGetJSON('http://localhost:3000/do_something')
को कॉल करते हैं मैं जानता हूँ कि यह एक लंबे समय से चल कॉल होने जा रहा है, मैं फोन
var jsonResponse = httpGetJSON('http://localhost:3000/do_something', 10 /* timeout */)
मैं सफलतापूर्वक इस दृष्टिकोण का उपयोग किया गया है अब कई हफ्तों के लिए।
काफी बदसूरत हैक की तरह दिखता है: गैर मान्यता प्राप्त चयनकर्ता उदाहरण
यहाँ एक पूरी तरह से काम कर रहे उदाहरण है कि google.com हिट और सभी उत्पादन लॉग है करने के लिए भेजा। लेकिन यह काम करना चाहिए :)। लेकिन मैं उपकरण ढूंढ रहा हूं जो आईओएस कोड को बदले बिना ऐसा करने की अनुमति देता है ... –
यदि आपको कोई मिलता है, तो मैं सभी कान हूं। Http://corner.squareup.com/2011/07/ios-integration-testing.html भी है लेकिन यह स्पष्ट रूप से अनियंत्रित एपीआई का उपयोग करता है। यह बहुत बुरा है ऐप्पल का समाधान इतना कठिन बेकार है। – esilver