[英]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.