符合Equatable的单元测试策略

时间:2015-10-22 03:28:14

标签: ios swift swift2

让我说我的模型struct符合Equatable,类似这样:

struct Model: Equatable {
    var a: Int = 0
    var b: String = ""
}

func ==(lhs: Model, rhs: Model) -> Bool {
    return lhs.a == rhs.a && lhs.b == rhs.b
}

现在我为此写一些单元测试。类似的东西:

func testModelsAreEqual() {
    let model1 = Model()
    let model2 = Model()
    XCTAssertEqual(model1, model2)
}

func testModelsAreNotEqual1() {
    let model1 = Model()
    var model2 = Model()
    model2.b = "hello world"
    XCTAssertNotEqual(model1, model2)
}

func testModelsAreNotEqual2() {
    let model1 = Model()
    var model2 = Model()
    model2.a = 1
    XCTAssertNotEqual(model1, model2)
}

但是如何编写一个测试来保护我免受另一个属性添加到Model的情况,而不会添加到==的成员等式检查中:

struct Model: Equatable {
    var a: Int = 0
    var b: String = ""
    var c: Double = 0
}

func ==(lhs: Model, rhs: Model) -> Bool {
    return lhs.a == rhs.a && lhs.b == rhs.b
}

显然,即使概念上我的Equatable被破坏,我的测试仍然会通过。我可以采用的测试策略是否有助于提醒我这个问题?对于斯威夫特的Mirror和有限的反思,我能做些什么吗?也许Mirror.children.count?或者有人有更好的建议吗?

2 个答案:

答案 0 :(得分:3)

在搜索其他解决方案之后,我决定使用反射进行成员计数以提醒我更改。以下是上述示例的测试:

func testModelStillHas2Members() {
    XCTAssertEqual(Mirror(reflecting: Model()).children.count, 2, "The member count of Model has changed, please check the `==` implementation to ensure all members are accounted for.")
}

答案 1 :(得分:0)

这是我的看法:

func testModel3() {
    let model1 = Model()
    var model2 = Model()
    model2.c = 1
    model2.p.name = "Jack"

    let mirror1 = Mirror(reflecting: model1)
    let mirror2 = Mirror(reflecting: model2)

    let prop1 = mirror1.children.reduce([String: NSObject]()) {
        (var dict, e) in
        dict[e.label!] = e.value as? NSObject
        return dict
    }
    let prop2 = mirror2.children.reduce([String: NSObject]()) {
        (var dict, e) in
        dict[e.label!] = e.value as? NSObject
        return dict
    }

    if model1 == model2 {
        XCTAssertEqual(prop1, prop2, "Not really equal")
    } else {
        XCTAssertNotEqual(prop1, prop2, "Not really diffrent")
    }
}

它构建了2个带有名称和字典的字典。 model1model2中所有属性的值,然后断言这两个词典是否相等。

大警告:我还没有彻底测试过这个问题。它适用于我投入的有限数量的案件。你可能需要从这里即兴发挥。