【问题标题】:How to compare to optional model properties with XCTAssertEqual如何使用 XCTAssertEqual 与可选模型属性进行比较
【发布时间】:2014-08-13 05:48:52
【问题描述】:

有没有更好的方法来比较我的模型对象中的值,而不是下面的 sn-p,它看起来非常冗长并且仅适用于一个属性?

模型对象

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() {

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);

if let param  = params[Address.kADDRESS1] as String? {
    if let property = address.address1 {
        XCTAssertEqual(property, param)
    }
    else {
        XCTFail("properties do not match")
    }
}
else {
    if let property = address.address1 {
        XCTFail("properties do not match")
    }
}

}

【问题讨论】:

    标签: ios swift xctest


    【解决方案1】:

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

    1. XCTAssertEqual 会让您的测试失败(带有适当的错误 消息)如果字符串不相等,因此您不需要任何XCTFail

    2. 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.adress1 为 nil,您将收到运行时异常,因为 XCTAssertEqual 将无法解开变量,但 XCTAssertNotNil 会提前失败,因此您知道发生了什么。

    【讨论】:

    • 虽然在这个测试中 params[Address.kAddress] 不为空,但它将在其他测试中,如果它们都为空,我将不得不比较,我最终想把它变成我可以用任何参数排列调用的函数
    【解决方案2】:

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

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

    【讨论】:

    • 你需要给测试失败的机会。如果其中一个值为 nil,这将跳过测试,并且您永远不会仅从测试中知道。此外,您应该解开不变量中的选项。
    猜你喜欢
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多