2014-09-26 12 views
7

Jak napisać test, który oczekuje wywołania metody za pomocą Swift i XCTest?XCTest oczekuje wywołania metody ze swiftem

Mogę używać OCMock, ale oficjalnie nie wspierają one szybkiego, więc nie wiele opcji.

+0

możliwe duplikat [Mocking Swift] (http://stackoverflow.com/ questions/24174130/mocking-in-swift) – ColinE

+1

Różnica od mojego pytania do tego jest taka, że ​​chcę oczekiwać wywołania metody i nie tylko kpić z metody. –

Odpowiedz

4

Jak już powiedziałeś, OCMock nie obsługuje Swift (ani OCMockito), więc na razie jedyny sposób, jaki widzę, to stworzyć ręcznie zwiniętą próbę. W szybkim tempie jest to trochę mniej bolesne, ponieważ można tworzyć wewnętrzne klasy w ramach metody, ale nadal nie jest tak poręczna jak szydercza struktura.

Oto przykład. Kod jest oczywisty, jedyną rzeczą, którą musiałem zrobić (zobacz EDYCJA 1 poniżej), aby to zadziałało, jest zadeklarowanie klas i metod, które chcę użyć z testu, jako publicznych (wydaje się, że klasy testowe nie należą do moduł kodu tej samej aplikacji - spróbuje znaleźć rozwiązanie tego problemu).

EDYCJA 1 2016/4/27: Deklaracja, że ​​klasy, które chcesz przetestować jako publiczne, nie są już potrzebne, ponieważ możesz użyć funkcji "@testable import ModuleName".

Test:

import XCTest 
import SwiftMockingPoC 

class MyClassTests: XCTestCase { 

    func test__myMethod() { 
     // prepare 
     class MyServiceMock : MyService { 

      var doSomethingWasCalled = false 

      override func doSomething(){ 
       doSomethingWasCalled = true 
      } 

     } 
     let myServiceMock = MyServiceMock() 

     let sut = MyClass(myService: myServiceMock) 

     // test 
     sut.myMethod() 

     // verify 
     XCTAssertTrue(myServiceMock.doSomethingWasCalled) 
    } 

} 

MyClass.swift

public class MyClass { 

    let myService: MyService 

    public init(myService: MyService) { 
     self.myService = myService 
    } 

    public func myMethod() { 
     myService.doSomething() 
    } 

} 

MyService.swift

public class MyService { 

    public init() { 

    } 

    public func doSomething() { 

    } 

} 
+0

Nie chciałbym utworzyć zmiennej tylko dla "doSomethingWasCalled" wewnątrz klasy próbnej, a następnie mieć assert dla każdej metody, która powinna zostać wywołana. Chciałem czegoś bardziej przypominającego deklarowanie zmiennej poza próbną klasą z oczekiwaniemWithDescription, spełnienie oczekiwań w metodzie klasy próbnej, a następnie wywołanie metody waitForExpectationsWithTimeout w teście. Ale to nie działa, test nie kompiluje (lub daje mi błąd "SourceKitService Crashed", tak naprawdę nie pamiętam, i nie mogę przetestować teraz, ponieważ mój kod nie kompiluje się z powodu czegoś innego realizowanie). –

+0

Również nie mogę przesłonić metody w teście tak, jak ty. Ten sam błąd, "SourceKitService Crashhed". –

+0

AFAIK XCTestExpectation jest testem asynchronicznym, nie widzę powodu, aby go używać, chyba że tego chcesz. O przesłonięciu tej metody upewnij się, że podajesz publicznie metody i klasy, których chcesz użyć w teście - kod mojej odpowiedzi działa dla mnie w Xcode. – e1985

Powiązane problemy