API违规 - 多次调用 - [XCTestExpectation fulfill]

时间:2015-01-28 10:18:52

标签: swift xctest

我正在Swift中编写我的第一个集成测试。

我正在尝试检查特定网址上是否存在图片。

我想执行头部请求并检查响应的状态代码。

我一直收到错误:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'API violation - multiple calls made to -[XCTestExpectation fulfill].

我试过让期望变弱。

我有以下代码/测试:

func testAndroidImagesExist() {
 weak var expectation: XCTestExpectation?
 expectation =  expectationForNotification(kBaoNotification_ManifestImportCompleted, object: nil) { (notification: NSNotification!) -> Bool in

 let userInfo: NSDictionary = notification.userInfo!
 var titles = userInfo.valueForKey("titles") as? NSArray
 titles?.enumerateObjectsUsingBlock({ (t: AnyObject!, idx: Int, stop: UnsafeMutablePointer<ObjCBool>) -> Void in
  let title = t as NSDictionary

  let titleLabel = title.valueForKey("title") as String
  let parameters = title.valueForKey("parameters") as NSDictionary
  let androidImageUrl = parameters.valueForKey("android_logo_url") as String
  var androidRequest = NSMutableURLRequest(URL: NSURL(string: androidImageUrl)!)
  androidRequest.HTTPMethod = "HEAD"
  var androidResponse: NSURLResponse?
  var androidData = NSURLConnection.sendSynchronousRequest(androidRequest, returningResponse: &androidResponse, error: nil)
  var androidHttpResponse = androidResponse as? NSHTTPURLResponse

  if androidHttpResponse != nil {
   if androidHttpResponse!.statusCode == 404 {
    XCTFail("Android image not found for title \(titleLabel)")
   }
  } else {
   XCTFail("No response from android image for title \(titleLabel)")
  }
 })
 expectation?.fulfill()
 return true
}
 waitForExpectationsWithTimeout(10, handler: { (error: NSError!) -> Void in
  if (error != nil) {
   XCTFail("Timeout error: \(error)")
  }
 }) 
}

有什么想法吗?

4 个答案:

答案 0 :(得分:13)

我建议最好处理多次出现的期望是在完成后将期望变量设置为nil。然后,后续调用将被忽略。

目标C:

// Fulfill and remove. Subsequent messages to nil are ignored.
[multiEx fulfill];
multiEx = nil;`

<强>夫特:

// Fulfill and remove. Optional chaining ends execution on nil.
var multiEx:XCTestExpectation? = expectationWithDescription("multiEx")
...
multiEx?.fulfill() 
multiEx = nil

答案 1 :(得分:0)

我遇到了同样的问题(在Objective-C中);我在完成之前添加了对空ptr的检查,它似乎对我来说稳定。

答案 2 :(得分:0)

我已经为此苦苦挣扎了一段时间,而投票率最高的答案对我却没有用。主要区别在于异步响应是通过委托而不是闭包进行的。

对我有用的是在第一次调用“ fulfill”之后将我的代表设置为零。

希望它可以帮助某人。

答案 3 :(得分:0)

使用Expectation.fulfillmentcount,您将能够多次满足期望

func testMethod() {
let exp = expectation(description:)
let exp.fullfillmentCount = INT
exp.fullfill x called == exp.fullfillmentCount -> testpass
}