【问题标题】:Do swift tests support generics?快速测试是否支持泛型?
【发布时间】:2018-04-02 13:53:22
【问题描述】:

如果我尝试这个,它会运行测试并成功,所有标记为绿色:

import XCTest


class SomeTestCaseSon: XCTestCase {
    override func setUp() {
        super.setUp()
    }

    func testblablblblablba() {
    }

}

class SomeTestCase: XCTestCase {
    override func setUp() {
        super.setUp()
    }

    func testblablblblablba() {
    }
}

class SomeGenericTestCase<T:NSObject>:XCTestCase {
    override func setUp() {
        super.setUp()
    }

    func testblablblblablba() {

    }
}

但如果您尝试为此运行测试:

class SomeGenericTestCase<T:NSObject>:XCTestCase {
    override func setUp() {
        super.setUp()
    }

    func testblablblblablba() {

    }
}


class SomeTestCaseGeneral: SomeGenericTestCase<NSObject> {
    override func setUp() {
        super.setUp()
    }

    override func testblablblblablba() {
    }
}

刚刚忽略了 2 个类。

测试是否支持泛型?难道我做错了什么? 感谢您的帮助)

【问题讨论】:

    标签: swift unit-testing generics swift4 xcode9.2


    【解决方案1】:

    Xcode 不支持此功能。使用泛型运行测试后

    class BaseTestClass<T>: XCTestCase {
        var subject: T!
    }
    class SpecializedTestCase: BaseTestClass<TestClass> {
        // Tests
    }
    

    它们不会出现在 Xcode 的报告导航器中。但是,在 Xcode 中不会引发任何错误或警告,并且 Xcode 似乎已经运行了测试。另外,如果开启了代码覆盖,你会看到覆盖显示为红色。

    但是,我在操场上设置了一个案例,它确实执行了测试。

    import XCTest
    
    protocol Calculator {
        init()
        func add(a: Int, b: Int) -> Int
    }
    
    final class MyClass: Calculator {
    
        func add(a: Int, b: Int) -> Int {
            return a + b
        }
    
    }
    
    class BaseTestCase<T: Calculator>: XCTestCase {
    
        var subject: T!
    
        override func setUp() {
            super.setUp()
            subject = T()
        }
    
        func testShouldAdd() {
            XCTAssertEqual(subject.add(a: 2, b: 2), 4)
    //        XCTAssertEqual(subject.add(a: 2, b: 2), 5)
        }
    }
    
    class TestCase: BaseTestCase<MyClass> {
    
    }
    
    TestCase.defaultTestSuite.run()
    

    测试输出:

    Test Suite 'TestCase' started at 2018-04-02 10:25:56.051
    Test Case '-[__lldb_expr_26.TestCase testShouldAdd]' started.
    Test Case '-[__lldb_expr_26.TestCase testShouldAdd]' passed (0.006 seconds).
    Test Suite 'TestCase' passed at 2018-04-02 10:25:56.059.
         Executed 1 test, with 0 failures (0 unexpected) in 0.006 (0.008) seconds
    

    如果第二个断言未注释,测试将失败。我的看法是,Xcode中注册测试用例的方式不支持泛型参数,但是如果是手动注册测试用例,则可以支持。

    参考: https://medium.com/@johnsundell/writing-unit-tests-in-swift-playgrounds-9f5b6cdeb5f7

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-11
      • 2014-03-21
      • 1970-01-01
      相关资源
      最近更新 更多