XCTest 和使用模拟对象作为通知接收器

XCTest and using mock objects as notification receivers

在带有 swift 的 XCTest 中,您可以在需要它的测试函数中定义模拟对象。像这样

func testFunction(){
    class mockClass: AnyObject{
        func aFunction(){
        }
    }
}

我正在尝试使用这些模拟对象来测试另一个函数是否在给定特定条件的情况下发出正确的通知(在我的例子中,成功通知是通过 204 状态代码广播到对象的。

我遇到的问题是我得到一个 "Unrecognised selector" 运行时错误,即使 deletedSuccess() 函数显然存在/

这是一些代码转储

func testDelete(){
    let expectation = expectationWithDescription("Post was deleted")

    class MockReciever : AnyObject {
        func deleteSuccess(){
            println("delete successfull")
            expectation.fulfill()
        }
    }

    let mockReciever = MockReciever()
    NSNotificationCenter.defaultCenter().addObserver(mockReciever, selector: "deleteSuccess", name: PostDeletedNotification, object: post)
    let response = NSHTTPURLResponse(URL: NSURL(), statusCode: 204, HTTPVersion: nil, headerFields: nil)
    let request = NSURLRequest()
    post.deleteCompletion(request, response: response, data: nil, error: nil)

    waitForExpectationsWithTimeout(30, handler: { (error) -> Void in
        if error != nil{
            XCTFail("Did not recieve success notification")
        } else {
            XCTAssertTrue(true, "post deleted successfully")
        }
        NSNotificationCenter.defaultCenter().removeObserver(mockReciever)
    })
}

使用像这样的模拟对象和选择器是否存在某种我不知道的问题?

您不必实施模拟对象来测试通知。有一个-[XCTestCase expectationForNotification:object:handler:]方法。

这里 an answer 关于如何在 Swift 类 中接收来自 NSNotificationCenter 的通知,这些通知不是从 NSObject 继承的。从技术上讲,这是一个重复的问题。