简体   繁体   English

如何与XCTAssertEqual比较可选的模型属性

[英]How to compare to optional model properties with XCTAssertEqual

Is there a better way to compare the values in my model object, than the following snippet which seems very verbose and it's only for one property? 是否有更好的方法来比较我的模型对象中的值,而不是下面的代码片段,它看起来非常详细,而且只针对一个属性?

Model Object 模型对象

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?)
    }
}

From test case func testCreateAddress() { 来自测试用例 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")
    }
}

} }

I think you can assume a few things in your test: 我想你可以在测试中假设一些东西:

  1. XCTAssertEqual will let your test fail (with an appropriate error message) if the strings are not equal and thus you don't need any XCTFail 如果字符串不相等, XCTAssertEqual将让您的测试失败(带有相应的错误消息),因此您不需要任何XCTFail

  2. params[Address.kADDRESS1] is definitely set as you just defined it above params[Address.kADDRESS1]肯定是你刚才定义的那样设置的

So I'd suggest to change your test to look like this: 所以我建议你把测试改成这样:

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

I admit that in case address.adress1 is nil, you will get a runtime exception as the XCTAssertEqual will not be able to unwrap the variable but XCTAssertNotNil will fail beforehand so you know what's happening. 我承认,如果address.adress1为nil,你将得到一个运行时异常,因为XCTAssertEqual将无法解包变量,但XCTAssertNotNil会事先失败,所以你知道发生了什么。

I think I've found a more succinct way: 我想我发现了一种更简洁的方式:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM