gpt4 book ai didi

ios - 使用 PromiseKit 的单元测试功能

转载 作者:搜寻专家 更新时间:2023-10-31 08:04:36 24 4
gpt4 key购买 nike

我有以下要测试的功能:

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()),我不知道为什么。有什么想法吗?

最佳答案

事实证明我快到了,但我不得不让我的模拟管理器返回一个 fulfill 并传递一个 Product(NSManagedObject 子类)。所以现在我的模拟经理看起来像这样并且我的测试有效:

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

let managedObjectContext = setUpInMemoryManagedObjectContext()
let entity = NSEntityDescription.entityForName("Product", inManagedObjectContext: managedObjectContext)
let product = Product(entity: entity!, insertIntoManagedObjectContext: managedObjectContext)
deferredPromise.fulfill(product)

return deferredPromise.promise
}
}

关于ios - 使用 PromiseKit 的单元测试功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38874869/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com