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.
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.
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() {
}
}
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). –
Również nie mogę przesłonić metody w teście tak, jak ty. Ten sam błąd, "SourceKitService Crashhed". –
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
możliwe duplikat [Mocking Swift] (http://stackoverflow.com/ questions/24174130/mocking-in-swift) – ColinE
Różnica od mojego pytania do tego jest taka, że chcę oczekiwać wywołania metody i nie tylko kpić z metody. –