HintergrundEntwerfen einer Objective-C-Klasse
Ich arbeite meistens mit Java prüfbar zu sein. Hier ist ein Code, den ich in Objective-C geschrieben habe. Mein Ziel ist es, einige Komponententests für "MyService" zu schreiben. Zu Ihrer Information: Der Name der Klasse in diesem Code ist nur ein Platzhalter.
Frage
Ist dies wie ein sinnvoller Ansatz scheinen? Ich bin:
- Giving dieser Klasse ein Singleton-Methode (
sharedMyService
) - einen Konstruktor Deklarieren
NSURLSession
- Die Aufnahme einer Standard-Konstruktor zu injizieren, die die reale
NSURLSession
Meine Absicht verwendet wird:
- Ich möchte diesen Code durch Mockingtesten
- würde ich spritzt, dass
NSURLSession
Mock in diese Klasse es - vermutlich auf der Apple-docs zu testen mehr lesen oder irgendwo zu sehen, wie die
dataTaskWithURL:
Methode zu verspotten. Hier
ist die Header-Datei:
#import <Foundation/Foundation.h>
@interface MyService : NSObject
@property(nonatomic, strong, readwrite) NSURLSession *session;
+ (id)sharedMyService;
- (instancetype)initWithURLSession:(NSURLSession *)session;
- (void)fetchData:(NSString*)location;
@end
Und die Umsetzung ...
#import "MyService.h"
@implementation MyService
static NSString *const targetUri = @"http://something.com/%@";
+ (instancetype)sharedMyService {
static MyService *service = nil;
@synchronized (self) {
if (service == nil) {
service = [[self alloc] init];
}
}
return service;
}
- (instancetype)initWithURLSession:(NSURLSession *)session {
self = [super init];
if (self) {
self.session = session;
}
return self;
}
- (instancetype)init {
return [self initWithURLSession:[NSURLSession sharedSession]];
}
- (NSURLSession *)getSession {
return self.session;
}
- (void)fetchData:(NSString*)location {
NSURL *targetUrl = [NSURL URLWithString:[NSString stringWithFormat:targetUri, location]];
NSURLSession *urlSession = [self getSession];
NSURLSessionTask *sessionTask = [urlSession dataTaskWithURL:targetUrl completionHandler: ^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSLog(@"Request succeeded.");
}];
[sessionTask resume];
}
Thanks @ josh-caswell überprüft nur die Bedeutung meiner misspelling: -S – Wain
Huh, habe ich nicht einmal wissen, dass es ein Wort war! :) –