Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何测试所需的初始化(编码器:)?_Swift_Unit Testing_Xcode7.1beta - Fatal编程技术网

Swift 如何测试所需的初始化(编码器:)?

Swift 如何测试所需的初始化(编码器:)?,swift,unit-testing,xcode7.1beta,Swift,Unit Testing,Xcode7.1beta,在我的自定义类WLNetworkClient中,我必须实现这样的方法: required init(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } 我不需要使用它,但我想测试它以使代码覆盖率达到100%。你知道如何做到这一点吗 我尝试了以下方法,但没有成功: let nc = WLNetworkClient(coder: NSCoder()) XCTAssertNotNil

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

required init(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}
我不需要使用它,但我想测试它以使代码覆盖率达到100%。你知道如何做到这一点吗

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

let nc = WLNetworkClient(coder: NSCoder())
XCTAssertNotNil(nc)
以下是对您有帮助的答案:

let cd = NSKeyedUnarchiver(forReadingWithData: NSMutableData())
let c = CustomTextField(coder:cd)
生产代码:

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

由于所需的初始值设定项返回
nil
,并且不使用编码器,因此上述代码可以简化为:

func testInitWithCoder() {
    let someView = SomeView(coder: NSCoder())
    XCTAssertNil(someView)
}

鲁道夫·阿达姆科维奇(Rudolf Adamkovičist)的回答仍然与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)
}

我将鲁道夫的回答与利兹的建议结合起来,得出以下解决方案:

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

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

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

的情况下崩溃。我使用改进的Rudolf的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)
}

不幸的是,它仍然无法工作:
***-[NSKeyedUnarchiver initForReadingWithData:]:数据为空;您是否忘记将-finishEncoding发送到NSKeyedArchiver?
这在稍微不同的情况下对我不起作用。我将super.init(coder:aDecoder)作为第二行调用,它将停止在该行上运行。没有崩溃就不能完成测试。对我来说失败(Xcode 9.3,Swift 4.1):
测试失败:testInitWithCoder()失败:失败:捕获到“NSInvalidArgumentException”,“***-decodeObjectForKey:仅为抽象类定义。Define-[NSKeyedArchiver decodeObjectForKey:!”
@Oliver,当我遇到错误时,这是因为我给我的初始化器提供了一个专用的归档器,而不是专用的Deachiver。。。我应该创建一个新的nskeyedunachiver,将archiverData作为init参数。初始值设定项
nskeyedurchiver(forWritingWith:)
在iOS12中已被弃用。如果您收到该警告,您可以将该行替换为
let archiver=NSKeyedArchiver(RequiringSecureCodeding:true)
这现在不起作用,失败时出现错误
捕获到“NSInvalidArgumentException”,“***-containsValueForKey:无法发送到NSCoder类的抽象对象:创建具体实例!”
xctasertnil
XCTAssertNotNil
当然。@Oliver Pearmain鉴于当前实现返回nil,AssertNil是正确的测试(即使我们大多数人可能会使用NotNil),NSKeyedArchiver(forWritingWith:NSMutableData())已被弃用。
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)
}