2016-08-10 3 views
1

Ich habe die folgende Funktion verwendet, die ich testen wollen:Einheit Testfunktion, die PromiseKit

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") 
       } 
      } 
     } 
    } 
} 

Hier ist das Mock-Manager ich herstellte.

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 
    } 
} 

Und hier ist der nicht funktionierende Test.

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") 
} 

Ich weiß, der Mock-Manager wird immer genannt, aber meine Erwartung wird nie erfüllt (wird exp.fulfill() nicht genannt), und ich weiß nicht, warum. Irgendwelche Ideen?

+0

Stellen Sie sicher, dass alle Pfade in Ihrem Handler Anruf erfüllen oder ablehnen! Andernfalls erhalten Sie Pfade, die nicht vollständig sind! – mxcl

Antwort

0

Es stellte sich heraus, dass ich fast da war, aber ich musste meinen falschen Manager eine Erfüllung zurückgeben und eine (NSManagedObject Unterklasse) übergeben. So jetzt sieht mein Scheinmanager so aus und meine Tests funktionieren:

+2

'return Versprechen (Wert: Produkt)' hätte ausgereicht. – mxcl

Verwandte Themen