【问题标题】:XCTest for test setter in model objectXCTest 用于模型对象中的测试设置器
【发布时间】:2024-05-20 18:40:01
【问题描述】:

我有一个带有计算变量的模型对象。现在我想测试变量的设置器。我写了一个测试用例,它给出了以下错误

XCTAssertEqual 失败:("nil") 不等于 ("Optional("example@gmail.com")") -

下面我提到了我写的测试用例

func testNetworkModelObjectSet() {

    let testObject = ["network": ["first_name": "Dimuth", "last_name": "Lasantha", "business_email": "testemail@gmail.com", "currency": "USD", "language": "en-us", "category": "individual"]]

    let network = HVConnection(data: testObject)

    network.business_email = "example@gmail.com"

    XCTAssertEqual(network.business_email, "example@gmail.com")
}

这里我提到了相关的模型对象变量

class HVConnection: NSObject {

    //private var _data: NSMutableDictionary
    private var _data: NSMutableDictionary

    // MARK:- Init

    init(data: NSDictionary)
    {
        _data = NSMutableDictionary(dictionary: data)
    }

    var business_email: String? {

        get {
            if let businessemailObject = _data.objectForKey("network")?.objectForKey("business_email") {
                return (businessemailObject as! String)
            } else {
                return nil
            }
        }

        set {
            _data = ["business_email": newValue!]
        }
    }
}

【问题讨论】:

  • 您应该将XCTAssertEqualObjects 用于对象,XCTAssertEqual 用于原始类型,例如intchardouble 等。
  • @rckoenes Swift 的XCTest 没有XCTAssertEqualObjects
  • @Cristik 你是对的,在两者之间切换。

标签: ios xcode swift xctest


【解决方案1】:

我已将设置器更改如下

set {
        _data = ["network":["business_email": newValue!]]
    }

现在测试用例通过了

【讨论】:

  • 这里发布的答案是否帮助您找到了这个解决方案?
【解决方案2】:

您正在阅读来自_data["network"]["business_email"],但正在写信至_data["business_email"]。您应该根据规范更新 getter 或 setter。

作为旁注,您可以以更短/更易读的方式重写 getter:

get {
    return _data["network"]?["business_email"] as? String
}

Swift 的optional chaining 特性使得在方法调用链中检查 nil 变得非常容易。

另请注意,如果传递了 nil 值,setter 将使应用程序崩溃,因为在尝试解包 nil 时强制解包会崩溃。

【讨论】:

    【解决方案3】:

    通过设置network.business_email = "example@gmail.com",您将使用["business_email": newValue!] 覆盖_data 的内容。

    这将导致 getter 返回nil,因为它将进入else 的情况,因为_data.objectForKey("network")nil。因此,行为符合预期。

    【讨论】:

      最近更新 更多