繁体   English   中英

Swift 中的等价测试

[英]Equatable Testing in Swift

我正在寻找有关测试 swift 对象相等性的良好做法的建议

如果我有一个具有许多属性的复杂对象,很容易错过相等的实现。

执行平等实施的良好做法是什么?

更多细节:当然,您可以编写测试来检查两个值是否应该相等,但这里的问题是这很容易破坏。 您的项目中有一个结构,六个月后,另一个开发人员向该结构添加了一个属性。 假设他忘记将属性添加到等式中。 相等性仍然有效,测试通过,但只有该属性更改时,您的应用程序才会中断。 我的问题是,有没有办法避免这个问题?

在一个非平凡的应用程序中很容易最终拥有具有 10 个值的模型对象,并使用嵌套的模型对象。 那么我怎样才能控制我的模型对象的平等呢? 如何降低平等实施中的人为错误风险?

可能的解决方案:我想到的一个解决方案是编写一个脚本,查看符合特定协议的类和结构的编译时间

Diffable : Equatable {}

对于所有采用Diffable的类/结构,我将检查测试文件的存在,即:

对于Foo类,我将寻找一个测试类Foo_Tests_Diffable

对于Foo中的所有属性,我将检查是否存在符合以下名称模式的测试函数

test<property name>Diffable

IE:

class Foo : Diffable {
   var title: String
   var color: UIColor
   var tag: Tag
}

我将在Foo_Tests_Diffable中检查以下测试

func testTitleDiffable {
// Test
}

func testColorDiffable {
// Test
}

func testTagDiffable {
// Test
}

如果所有脚本都找到了所有预期的测试而不是编译步骤通过,否则失败

但是这个解决方案很耗时,我不知道我是否能够实现它,所以欢迎任何建议

我会专门为此目的创建单元测试

class YourObjectEquatableTests: XCTestCase
{
    func testPropertyOne()
    {
        var object1 = /* ... */
        var object2 = /* ... */

        object1.propertyOne = nil
        object2.propertyOne = nil

        XCTAssertEqual(object1, object2)
        object1.propertyOne = "different value"
        XCTAssertNotEqual(object1, object2)

        /* etcetera */
    }

    func testPropertyTwo()
    {
        /* ... */
    }
}

注意:如果你在实现 Equatable 细节之前编写测试用例,你实际上是在做 TDD,这非常酷!

我没有尝试很多,但 Swift 具有反射功能。

https://appventure.me/2015/10/24/swift-reflection-api-what-you-can-do/

所以在你的情况下,你可以镜像一个类,然后在你的测试中加入一些条件。

例如,您可以为测试中的类设置修复编号或属性或方法。

let nbAttributes = 6

然后检查它:

aMirror.children.count

我在操场上写了一个简单的例子,如果我添加一个方法变量,孩子的数量就会增加。 我不知道是否可以检查方法。

class toto{
  var io = 9
  var tutu = "yo"
  func test(){

  }
}

let toto1 = toto()

let aMirror = Mirror(reflecting: toto1)
aMirror.children.count

另一个链接: swift 2 中的反射

希望有帮助:)

是的,扩展@Mikael 的答案,您可能应该使用反射。

一个例子是:

String(reflecting: obj1) == String(reflecting: obj2)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM