Wie kann ich HTTP-Anfragen und -Antworten mithilfe von NSURLSession in iOS 7.1 testen?

Ich würde gerne wissen, wie man "unit test" von HTTP-Anfragen und-Antworten mit NSURLSession. Jetzt meine Abschluss-block-code wird nicht aufgerufen, wenn die Ausführung als unit test. Jedoch, wenn der gleiche code ausgeführt wird, innerhalb der AppDelegate (didFinishWithLaunchingOptions), wird der code innerhalb der completion-block wird aufgerufen. Wie bereits in diesem thread, NSURLSessionDataTask dataTaskWithURL Abschluss-handler nicht immer genanntdie Verwendung von Semaphoren und/oder dispatch_group ist nötig", um sicherzustellen, dass der Haupt-thread blockiert, bis die Netzwerk-Anfrage beendet ist."

Meine HTTP-post-code sieht wie folgt aus.

@interface LoginPost : NSObject
- (void) post;
@end

@implementation LoginPost
- (void) post
{
 NSURLSessionConfiguration* conf = [NSURLSessionConfiguration defaultSessionConfiguration];
 NSURLSession* session = [NSURLSession sessionWithConfiguration:conf delegate:nil delegateQueue:[NSOperationQueue mainQueue]];
 NSURL* url = [NSURL URLWithString:@"http://www.example.com/login"];
 NSString* params = @"[email protected]&password=test";
 NSMutableRequest* request = [NSMutableURLRequest requestWithURL:url];
 [request setHTTPMethod:@"POST"];
 [request setHTTPBody:[params dataUsingEncoding:NSUTF8StringEncoding]];
 NSURLSessionDataTask* task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
  NSLog(@"Response:%@ %@\n", response, error); //code here never gets called in unit tests, break point here never is triggered as well
  //response is actually deserialized to custom object, code omitted
 }];
 [task resume];
 }
@end

Die Methode, die tests dieser sieht wie folgt aus.

- (void) testPost
{
 LoginPost* loginPost = [LoginPost alloc];
 [loginPost post];
 //XCTest continues by operating assertions on deserialized HTTP response
 //code omitted
}

In meinem AppDelegate den Abschluss-block-code funktioniert, und es sieht wie folgt aus.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
 //generated code
 LoginPost* loginPost = [LoginPost alloc];
 [loginPost post];
}

Irgendwelche Hinweise, wie man den Abschluss-block ausgeführt, wenn die Ausführung in einem unit test? Ich bin ein Neuling in der iOS-also ein klares Beispiel würde wirklich helfen.

  • Hinweis: ich weiß, was ich Fragen kann auch nicht sein "unit" - Tests in einem strengen Sinn, ich verlasse mich auf einen HTTP-server als Teil meiner Prüfung (also, was ich fordere, ist mehr wie eine integration testing).
  • Hinweis: ich weiß es gibt einen anderen thread Unit-tests mit NSURLSession über unit-testing mit NSURLSession, aber ich will nicht spotten Antworten.

InformationsquelleAutor der Frage Jane Wayne | 2014-05-14

Schreibe einen Kommentar