如何测试Firebase DataSnapshot以模拟对象解析?

时间:2017-06-21 15:02:13

标签: ios swift firebase firebase-realtime-database

我正在尝试测试将Firebase DataSnapshot对象解析为模型对象。 假设我有这个模型:

struct Foo {
  var ref: DatabaseReference?
  var foo: String

  init?(snapshot: DataSnapshot) {
    guard 
      let snapValue = snapshot.value as? [String: Any],
      let foo = snapValue["foo"] as? String
      else { return nil }

    self.ref = nil // for testing purposes
    self.foo = foo
}

如何使用某些虚拟数据获取快照?我似乎无法制作一个DataSnapshot并手动设置值:

  

DataSnapshots传递给侦听器中的方法[...]它们无法修改,永远不会改变。

我也不认为我可以初始化DatabaseReference并手动设置值 - 它只是空出来的。

那我怎么测试呢?我想我可能会将我的模型更改为init?(dictionary: [String: Any], ref: DatabaseReference),而不仅仅是DataSnapshot,但这看起来有点像hacky。

1 个答案:

答案 0 :(得分:0)

目前有超过200个观看次数,因此为其他人澄清。重构您的方法以传递字典,然后单独测试两种方法。

struct Foo {
 var foo :String

 init?(snapshot: DataSnapshot) {
  guard let dictionary = snapshot.value as? [String: Any] 
  else { return nil }

  self.init(dict: dictionary)
 }

 init?(dict: [String:Any] {
  guard let foo = dict["foo"] as? String else { return nil }

  self.init(foo: foo)
 }

}

然后对两种方法进行单元测试,例如:

func testInitDataSnapshot() {
    let snapshot = DataSnapshot()

    let dut = Foo(snapshot: snapshot)

    expect(dut).to(beNil())

}

func testInitDictionary() {
    let dict = ["foo" : "bar"]

    let dut = Foo(dict: dict)

    expect(dut).toNot(beNil())
    expect(dut.foo)to(equal("bar"))
}