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

时间:2015-08-13 17:40:53

标签: ios unit-testing xctest xctestexpectation

在XCTest with swift中,你可以在你需要的测试函数中定义模拟对象。就像这样

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

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

我遇到的问题是,即使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)
    })
}

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

1 个答案:

答案 0 :(得分:6)

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

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