【问题标题】:How can one use XCTAssertNil with optional structs?如何将 XCTAssertNil 与可选结构一起使用?
【发布时间】:2014-12-28 08:04:24
【问题描述】:

2016 年 3 月 23 日更新 我刚刚在下面测试了我的原始示例代码,它在 XCode 7.3 中都能正常编译。看起来 XCTAssertNil 一直在更新以采用 () throws -> Any? 类型的表达式,因此可能不再需要这个问题和答案(除了有一段时间使用旧版本的编译器。)

我正在使用 XCTest 在 XCode 中编写我的第一个单元测试。我不确定如何利用 XCTAssertNil 因为它似乎只在使用某些类型时才能编译。它似乎可以使用由类和内置原语制成的可选项,但不适用于结构。如何使用这种方法?

对于结构,编译器给出以下错误(假设“SimpleStruct”是您的类型的名称):

'SimpleStruct' is not identical to 'AnyObject'

这里有一个简单的测试类来说明一些可以编译的类型和其他不能编译的类型。

import Cocoa
import XCTest

struct SimpleStruct {
}

class SimpleClass {
}

class Tests: XCTestCase {

    func testl() {
        var simpleStruct:SimpleStruct? = nil;
        var simpleClass:SimpleClass? = nil;
        var i:Int? = nil;
        var s:String? = nil;
        var tuple:(Int,String)? = nil;

        XCTAssertNil(simpleStruct); // compile error
        XCTAssertNil(simpleClass); // OK
        XCTAssertNil(i); // OK
        XCTAssertNil(s); // OK
        XCTAssertNil(tuple); // compile error
    }

}

【问题讨论】:

    标签: swift xctest


    【解决方案1】:

    2016 年 3 月 23 日更新已针对 XCode 7.3 进行了更新(但是,如果您看到我对该问题的编辑,则似乎不再需要此解决方法)

    这是一种解决方法。我创建了自己的通用函数:

    func AssertNil<T>(@autoclosure expression: () -> T?, message: String = "",
                   file: StaticString = #file, line: UInt = #line) {
    
        if (expression() != nil) {
            XCTFail(message, file:file, line:line)
        }
    }
    

    这似乎没有必要。这仅仅是 XCTest 最初针对 Objective-C 并且没有为 Swift 进行足够的更新/桥接的结果吗?

    编辑:我已经做了足够的研究,发现 AnyObject 可用于表示任何类,但不能表示结构。但是,这并不能解释为什么我的原始帖子中的代码会针对 Int 类型和 String 类型进行编译。 (我在其他地方读到 Xcode 可能会自动将这些转换为 NSNumber 和 NSString,这可能会解释原因。请参阅 http://www.scottlogic.com/blog/2014/09/24/swift-anyobject.htmlhttp://www.drewag.me/posts/swift-s-weird-handling-of-basic-value-types-and-anyobject。我将尝试删除导入 Foundation 的 Cocoa 导入,看看会发生什么)

    Edit2:XCTest 也导入 Foundation,所以我无法测试我想要的。我可以创建自己的方法并对此进行测试。现在,我假设自动转换是允许 int 和 string 选项编译的原因。似乎 XCTest 还没有为 Swift 的黄金时间做好准备。

    2015 年 8 月 13 日更新:编辑功能以兼容 XCode 7 beta

    【讨论】:

    • 是的,看起来 XCTest 需要做一些工作。现在我的工作对我来说很好。在失败的情况下,我将更新消息以提供更多信息,而不是默认为空字符串。
    • 谢谢@Jeef。我将更新我的答案以对此进行呼叫说明。
    • @Jeef 我认为必要的更改是将 FILELINE 变量替换为新变量?
    • @Jeef 现已为 XCode 7.3 修复
    猜你喜欢
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-01
    相关资源
    最近更新 更多