首页 > 解决方案 > 在 ios swift 代码中更新属性同时保持函数尽可能纯净和可测试的方法?

问题描述

长期在这里的 IOS 开发人员/修补程序。我主要是自学编程,过去是 OBJ-C,现在是 Swift。所以如果我问的东西太基础了,请提前道歉,部分原因是我可能不精通一些基础知识。

我目前正在开发一个应用程序。除此之外,我一直在阅读有关编写可测试代码和一般测试的大量内容。我不是在谈论纯粹的 TDD,但我希望我为应用程序创建的库有一个好的测试集可用。部分原因是它的良好做法,部分原因是我想学习做得更好。

所以在这里,在我的应用程序类中,我有许多函数可以接收参数并给出输出(就像你做的那样!)。然而,这些函数中的一些也会对类属性进行更改,因为这些属性中的数据将在其他类函数中使用。例如:

class SomeClass() {
    var someArrayProperty: [String] = []
    var someInputParameter: String

     init(input: String) {
         //some initialisation code
         self.someInputParameter = input

         //Call function to build object
         let object = self.buildObject(inputParameter: self.someInputParameter)
     }

     func buildObject(inputParameter: String) -> SomeObject {
         let objectToReturn = SomeObject(withInputParameter: inputParameter)
         let stringToAddToArray = "Object 1 created"
         self.someArrayProperty.append(stringToAddToArray)
         return objectToReturn
     }
}

根据我对测试的了解,理想情况下,代码应该完成一项工作,并且不会更改代码之外的某些内容,因为它对于复杂的代码变得不可测试。在这里,我遇到的问题是我直接someArrayProperty在方法内更改 from,即在方法之外更改某些内容。

尽管这对代码来说不是问题并且一切正常,但我想从您自己的代码中的测试角度了解你们对此类事情的感受?您通常在自己的代码中遵循哪些模式/更改来避免它?

再次道歉,如果它是一个太基本的问题,但我认为这将帮助我填补我的知识空白,以便能够编写更漂亮的代码,而不是在下次某个地方完成小更新时正常工作和中断的东西。:)

谢谢

标签: iosswiftunit-testing

解决方案


因此,如果您的函数被调用buildObject,它应该在其中完成工作并且没有任何return价值。但是如果你调用它buildedObject,它应该返回构造对象。您可以在Apple 命名方法文档中了解更多信息。

所以你的代码应该是这样的:

class SomeClass() {
    var someArrayProperty: [String] = []
    var someInputParameter: String

     init(input: String) {
         //some initialisation code
         self.someInputParameter = input

         //Call function to build object
         let object = self.buildedObject(inputParameter: self.someInputParameter)

         // Other code which modifies data
         let stringToAddToArray = "Object 1 created"
         self.someArrayProperty.append(stringToAddToArray)
     }

     func buildedObject(inputParameter: String) -> SomeObject {
         let objectToReturn = SomeObject(withInputParameter: inputParameter)
         return objectToReturn
     }
}

推荐阅读