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)
}