14

在我的自定义类WLNetworkClient中,我必须实现这样的方法:

required init(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

我不需要使用它,但我想测试它以实现 100% 的代码覆盖率。你知道如何实现这一目标吗?

我尝试了以下方法但没有成功:

let nc = WLNetworkClient(coder: NSCoder())
XCTAssertNotNil(nc)
4

6 回答 6

10

生产代码:

required init?(coder: NSCoder) {
    return nil
}

测试:

func testInitWithCoder() {
    let archiverData = NSMutableData()
    let archiver = NSKeyedArchiver(forWritingWithMutableData: archiverData)
    let someView = SomeView(coder: archiver)
    XCTAssertNil(someView)
}

由于所需的初始化程序返回nil并且不使用编码器,因此上面的代码可以简化为:

func testInitWithCoder() {
    let someView = SomeView(coder: NSCoder())
    XCTAssertNil(someView)
}
于 2016-08-24T21:08:01.010 回答
3

是应该对您有所帮助的答案:

let cd = NSKeyedUnarchiver(forReadingWithData: NSMutableData())
let c = CustomTextField(coder:cd)
于 2015-12-22T09:43:09.673 回答
1

Rudolf Adamkovič 的回答仍在使用 Swift 4:

required init?(coder aDecoder: NSCoder) {
    return nil
}

func testInitWithCoder() {
    // 1. Arrange
    let archiver = NSKeyedArchiver(forWritingWith: NSMutableData())

    // 2. Action
    let viewController = ViewController(coder: archiver)

    // 3. Assert
    XCTAssertNil(viewController)
}
于 2018-03-24T22:11:50.063 回答
1

我将 Rudolf 的回答与 Liz 的建议结合起来,并以以下解决方案结束:

let viewController = SomeTableViewController(
    presenter: SomePresenterMock(),
    coder: NSKeyedUnarchiver(forReadingWith: Data())) 

XCTAssert(viewController?.tableView.numberOfSections == 1)

这里的关键是NSKeyedUnarchiver(forReadingWith: Data())用作模拟编码器,否则测试会因NSInvalidArgumentException.

于 2018-06-07T22:39:26.810 回答
1

我使用改进的鲁道夫的 Adamkovič 答案:

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

func test_initWithCoder() {
    let object = SomeView()
    let data = NSKeyedArchiver.archivedData(withRootObject: object)
    let coder = NSKeyedUnarchiver(forReadingWith: data)
    let sut = SomeView(coder: coder)
    XCTAssertNotNil(sut)
}
于 2021-02-12T13:49:52.693 回答
0

似乎所有以前的答案在 Swift 5 之后都停止了工作。

我设法修改了@ChikabuZ答案并使其像这样工作:

func testInitWithCoder() {
    // Given
    let object = SomeView()
    let data = try! NSKeyedArchiver.archivedData(withRootObject: object, requiringSecureCoding: false)
    let coder = try! NSKeyedUnarchiver(forReadingFrom: data)

    // When
    let sut = SomeView(coder: coder)

    // Then
    XCTAssertNotNil(sut)
}
于 2021-11-12T00:41:35.737 回答