Swift测试支持泛型吗?

4

如果我尝试这样做,它会运行测试并成功,所有测试都标有绿色:

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个类被忽略了。

enter image description here

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

1个回答

0

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

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

在Xcode的报告导航器中,它们不会出现。然而,在Xcode中没有抛出任何错误或警告,并且Xcode似乎已经运行了测试。此外,如果打开代码覆盖率,您将看到覆盖率显示为红色。

然而,我在playground中设置了一个案例,它确实执行了测试。

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接