Come scrivere un test che prevede una chiamata al metodo usando swift e XCTest?XCTest aspetta la chiamata al metodo con swift
Potrei usare OCMock, ma non supportano ufficialmente swift, quindi non c'è molta scelta.
Come scrivere un test che prevede una chiamata al metodo usando swift e XCTest?XCTest aspetta la chiamata al metodo con swift
Potrei usare OCMock, ma non supportano ufficialmente swift, quindi non c'è molta scelta.
Come hai detto, OCMock non supporta Swift (né OCMockito), quindi per ora l'unico modo che vedo è creare una finta rotolata a mano. In un attimo questo è un po 'meno doloroso dal momento che è possibile creare classi interne all'interno di un metodo, ma non è ancora così utile come un quadro di derisione.
Ecco un esempio. Il codice è auto esplicativo, l'unica cosa che dovevo fare (vedere EDIT 1 sotto) per farlo funzionare è dichiarare pubbliche le classi e i metodi che voglio usare dal test (sembra che le classi di test non appartengano al modulo di codice della stessa applicazione - cercherà di trovare una soluzione a questo).
EDIT 1 2016/4/27: Dichiarare che le classi che si desidera testare come pubbliche non sono più necessarie poiché è possibile utilizzare la funzionalità "@testable import ModuleName".
La prova:
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() {
}
}
Non vorrei creare una variabile solo per "doSomethingWasCalled" all'interno della classe di simulazione e quindi avere un'asserzione per ogni metodo che mi aspetto di chiamare. Volevo qualcosa di più come dichiarare una variabile al di fuori della classe mock con expectationWithDescription, soddisfare le sue aspettative nel metodo mock class e quindi chiamare waitForExpectationsWithTimeout nel test. Ma questo non funziona, il test non si compila (o mi dà l'errore "SourceKitService Crashed", non ricordo bene, e non posso testare adesso perché il mio codice non si sta compilando a causa di qualcos'altro che sono attuazione). –
Inoltre non riesco a scavalcare un metodo all'interno del test come hai fatto tu. Stesso errore, "SourceKitService si è bloccato". –
AFAIK XCTestExpectation è un test asincrona, non vedo alcun motivo per usarlo a meno che non lo si voglia. A proposito di sovrascrivere quel metodo, assicurati di dichiarare pubblici i metodi e le classi che desideri utilizzare nel test: il codice della mia risposta funziona per me in Xcode. – e1985
possibile duplicato di [derisione a Swift] (http://stackoverflow.com/ domande/24174130/mocking-in-swift) – ColinE
La differenza dalla mia domanda a quella è che voglio aspettarmi una chiamata di metodo e non solo prendere in giro un metodo. –