テストしたい次の機能があります。
func getProduct(ean: String) -> Promise<Product> {
return Promise { fullfill, reject in
let urlString = BSConstants.BarcodeScanner.productEndpoint.stringByAppendingString(ean)
serviceClient.GET(urlString, failure: { (error) in
reject(error!)
}) { (response) in
if let json = response {
self.storeProduct(json).then ({ returnedProduct in
fullfill(returnedProduct)
}).error { returnedError in
// HANDLE ERROR
print("HANDLE ERROR")
}
}
}
}
}
これが私が作成したモックマネージャーです。
class MockStoreProductProductManager: BSProductManagerSwift {
var storeProductWasCalled = false
var storeProductJSON: JSON?
let deferredPromise = Promise<Product>.pendingPromise()
override func storeProduct(json: JSON) -> Promise<Product> {
storeProductWasCalled = true
storeProductJSON = json
return deferredPromise.promise
}
}
そして、これが非動作テストです。
func testGetProduct_WithInStockEAN_RetunsValidInstockJSON() {
// Given
let mockManager = MockStoreProductProductManager(serviceClient: BSNetworkingServiceClient())
let inputEanString = "1234567891234"
var expectedJSON: JSON? = nil
if let jsonPath = NSBundle(forClass: self.dynamicType).pathForResource("getproduct-instock-response", ofType: "json") {
let data = NSData(contentsOfFile: jsonPath)!
stub(http(.GET, uri: "some-url-i-have-removed"), builder: jsonData(data))
let jsonResponse = JSON(data: data)
expectedJSON = jsonResponse["data"]
}
// When
let exp = expectationWithDescription("Return instock product JSON")
mockManager.getProduct(inputEanString).then { returnedProduct in
exp.fulfill()
}.error { error in
XCTFail(" Instock JSON should have been returned")
exp.fulfill()
}
waitForExpectationsWithTimeout(10, handler: nil)
// Then
XCTAssertTrue(mockManager.storeProductWasCalled, " Expected storeProduct function to be called but it wasn't")
XCTAssertEqual(mockManager.storeProductJSON, expectedJSON, " Incorrect JSON passed to storeProduct")
}
モック マネージャーが呼び出されることはわかっていますが、私の期待が満たされることexp.fulfill()
はなく (呼び出されない)、その理由もわかりません。何か案は?