Ios 如何使用XCTAssertEqual与可选模型属性进行比较

Ios 如何使用XCTAssertEqual与可选模型属性进行比较,ios,swift,xctest,Ios,Swift,Xctest,有没有更好的方法来比较我的模型对象中的值,而不是下面的代码片段,它看起来非常冗长,并且只针对一个属性 模型对象 struct Address { static let kADDRESS1 = "address1" static let kADDRESS2 = "address2" static let kADDRESS3 = "address3" static let kCITY = "city" static let kSTATE = "state"

有没有更好的方法来比较我的模型对象中的值,而不是下面的代码片段,它看起来非常冗长,并且只针对一个属性

模型对象

struct Address {

    static let kADDRESS1 = "address1"
    static let kADDRESS2 = "address2"
    static let kADDRESS3 = "address3"
    static let kCITY = "city"
    static let kSTATE = "state"
    static let kPOSTAL_CODE = "postalCode"

    var address1:String?,
    address2:String?,
    address3:String?,
    city:String?,
    state:String?,
    postalCode:String?

    init(address1: String?,
            address2: String?,
            address3: String?,
            city: String?,
            state: String?,
        postalCode: String?) {
            self.address1 = address1;
            self.address2 = address2;
            self.address3 = address3;
            self.city = city;
            self.state = state;
            self.postalCode = postalCode;

    }
    init(params:NSDictionary) {
        self.init(address1: params.objectForKey("address1") as String?,
            address2: params.objectForKey("address2") as String?,
            address3: params.objectForKey("address3") as String?,
            city: params.objectForKey("city") as String?,
            state: params.objectForKey("state") as String?,
            postalCode: params.objectForKey("state") as String?)
    }
}
来自测试用例 func testCreateAddress(){


}

我认为你可以在测试中假设一些事情:

  • xctasertequal
    会让您的测试失败(出现适当的错误 消息)如果字符串不相等,因此您不需要任何
    XCTFail

  • params[Address.kADDRESS1]
    的设置肯定与您刚才定义的一样 在上面

  • 因此,我建议将您的测试改为如下:

    let params:NSDictionary = [Address.kADDRESS1: "1 Main St.", Address.kADDRESS2: "Apt. 1", Address.kADDRESS3: "Box 1", Address.kCITY: "San Francisco", Address.kSTATE: "CA", Address.kPOSTAL_CODE: "7899"]
    
    let address = Address(params:params)
    XCTAssertNotNil(address.address1)
    XCTAssertEqual(address.address1!, params[Address.kADDRESS1], "address1 should be set")
    

    我承认,如果
    address.address1
    为零,您将得到一个运行时异常,因为
    xctasertequal
    将无法打开变量,但
    xctasertnotnil
    将提前失败,因此您知道发生了什么。

    我想我找到了一种更简洁的方法:

        if(address.address1? != nil && params[Address.kADDRESS1]? != nil) {
            XCTAssertEqual(address.address1!, params[Address.kADDRESS1]!)
        }
    

    虽然在这个测试中params[Address.kAddress]不是空的,但它将在其他测试中出现,在这种情况下,我必须比较它们是否都是空的,我最终想把它变成一个函数,我可以用任何排列的params调用它。你需要给测试一个失败的机会。如果其中一个值为nil,那么这将跳过测试,并且您永远不会仅从测试中知道。此外,您还应该展开不变量中的选项。
        if(address.address1? != nil && params[Address.kADDRESS1]? != nil) {
            XCTAssertEqual(address.address1!, params[Address.kADDRESS1]!)
        }