2017-06-09 2 views
1

Ich möchte beginnen, Testfälle für alle meine moya Anfragen zu schreiben. Ich habe überall im Internet gesucht, aber keine gefunden. * So testen Sie eine einfache moya .get-Anfrage.Wie moya Anfrage testen

Jede Hilfe wird geschätzt. Vielen Dank.

+0

Meinst du Unit-Tests? –

+0

@JasveerSingh ja. –

Antwort

0

Sie können OCMock verwenden, um den Beendigungshandler zu stubben und Ihre eigenen Vervollständigungshandler zurückzugeben. Beispiel -

__block UIView *mockViewAnimation; 
    __block void(^animationsBlock)(void); 
    __block void(^completionBlock)(BOOL); 

    beforeEach(^{ 
     void (^viewAnimation)(NSInvocation *) = ^(NSInvocation *invocation) { 
      [invocation retainArguments]; 
      [invocation getArgument:&animationsBlock atIndex:5]; 
      [invocation getArgument:&completionBlock atIndex:6]; 
     }; 

     mockViewAnimation = OCMClassMock([UIView class]); 

     // This stub tests the animation with duration, delay, and options 
     // Animation and Completion aren't tested here because they'll have their own tests. 

     OCMStub([mockViewAnimation animateWithDuration:1 
               delay:0 
               options:UIViewAnimationOptionCurveEaseIn 
              animations:[OCMArg any] 
              completion:[OCMArg any]]).andDo(viewAnimation); 

     [sut viewDidLoad]; 
    }); 

und dann können Sie rufen animationsBlock(); oder completionBlock (JA);

Dies ist ein Beispiel, um die Completion-Handler zu verspotten. Sie können die gleiche Logik verwenden, um Mayo-Completion-Handler nachzuahmen. oder irgendetwas anderes.

0

So mache ich meine Komponententests mit Moya. Ich habe meinen NetworkManager, der alle Anfragen und die init mit einem Standardparameter (um es auf Produktionscode zu verwenden), so dass wir einen anderen Anbieter beim Testen angeben können.

struct NetworkManager { 
    private let provider: MoyaProvider<MultiTarget> 

    init(provider: MoyaProvider<MultiTarget> = MoyaProvider<MultiTarget>()) { 
     self.provider = provider 
    } 

    func createUser(_ user: User, completion: @escaping (Result<User>) -> Void) { 
     provider.request(MultiTarget(UserApi.createUser(user: user))) { (result) in 
      switch result { 
      case .success(let response): 
       do { 
        let user = try response.map(User.self) 
        completion(.success(user)) 
       } catch let error { 
        completion(.error(error)) 
       } 
      case .failure(let error): 
       completion(.error(error)) 
      } 
     } 
    } 

    // other requests... 
} 

So auf Produktion Code können Sie so etwas wie dieses:

let manager = NetworkManager() 
let viewController = ViewController(networkManager: manager) 

Und auf Prüfung so etwas wie:

class TestMoyaTests: XCTestCase {  
    var networkManager: NetworkManager! 

    override func setUp() { 
     super.setUp() 
     networkManager = NetworkManager(provider: MoyaProvider<MultiTarget>(stubClosure: MoyaProvider.immediatelyStub)) 
    } 

    func testGetUser() { 
     let expected = User(id: "1", name: "John") 
     var response: User? 
     networkManager.getUser(id: "1") { (result) in 
      if case let .success(user) = result { 
       response = user 
      } 
     } 
     XCTAssert(response == expected) 
    } 

    // other tests... 
} 

Oder wenn das, was Sie suchen, ist zu Testen Sie die MoyaProvider selbst, können Sie überprüfen, wie Moya's team es tun. Da die Stubs sofort zurückgegeben werden, gibt es keine Notwendigkeit für Expections oder etwas in der Art (das ist, wie Moyas Team Test .sampleData).

Hoffe, das hilft!

Verwandte Themen