【问题标题】:Equatable Testing in SwiftSwift 中的等价测试
【发布时间】:2017-03-29 05:43:07
【问题描述】:

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

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

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

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

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

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

Diffable : Equatable {}

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

对于Foo的课程,我会寻找一个测试课程Foo_Tests_Diffable

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

test<property name>Diffable

即:

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

我将在Foo_Tests_Diffable 中检查以下测试

func testTitleDiffable {
// Test
}

func testColorDiffable {
// Test
}

func testTagDiffable {
// Test
}

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

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

【问题讨论】:

  • 嗯,这就是你添加测试的原因,对吧? ;) 如果在所有字段都相等时应将其视为相等,则将其声明为 struct 是一个好习惯。
  • 当然,您可以编写测试来检查两个值是否应该相等,但这里的问题是这很容易破坏。您的项目中有一个结构,六个月后,另一个开发人员向该结构添加了一个属性。假设他忘记将属性添加到等式中。相等性仍然有效,测试通过,但只有该属性更改时,您的应用程序才会中断。我的问题是,有没有办法避免这个问题?
  • 请扩展您的问题标题和正文以考虑您的评论。出于某种原因,这些 cmets 对我来说是隐藏的,我写了一个对你没什么用的答案。
  • 谢谢您的回复

标签: ios swift equality nsobject value-type


【解决方案1】:

我没怎么尝试,但 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

另一个链接: Reflection in swift 2

希望有帮助:)

【讨论】:

    【解决方案2】:

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

    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,这非常酷!

    【讨论】:

    • 谢谢,但正如我在对我的问题的评论中所写的那样。我的问题是我想“捕捉未来”对类或结构的更改。如果您在六个月内添加一个属性,我们如何才能发现相等性需要更新的事实
    猜你喜欢
    • 2021-04-10
    • 2011-12-15
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    • 2014-11-27
    • 2021-11-13
    • 1970-01-01
    相关资源
    最近更新 更多