哪些文件要写入测试

时间:2014-08-03 18:33:23

标签: unit-testing testing tdd

假设我有类a,它创建了类b的实例。假设类b是从通过Web调用反序列化的json更新的。

Class A
{
  function onNewJSONMessage(array) {
     for data in array {
       B *b = new B();
       b.updateWithData(b);
       self.myObjects.add(b);
    }
  }
}

Class B {
  function updateWithData(data) {
    // self.prop1 = data.prop1;
    // self.prop2 = data.prop2;
    // self.prop3 = data.prop3;
    // ...
  }
}

暂时忽略这种伪语言,只关注测试,我有两种方法可以测试它。

  1. 当受试者(A类)使用一个对象获取onNewJSONMessage时,

    • self.myObjects有一个具有prop1 ==“prop1”\ n
    • 的B类对象
    • self.myObjects有一个具有prop2 ==“prop2”
    • 的B类对象
    • self.myObjects有一个具有prop3 ==“prop3”
    • 的B类对象
    • ...
  2. 当受试者(B类)获得带有一个对象的updateWithData

    • self.prop1 == @“prop1”
    • self.prop2 == @“prop2”
    • self.prop3 == @“prop3”
    • ...
  3. 我喜欢(1)因为当我在onNewJSONMessage上开发时,我可以在updateWithData中打出正确的行,并确保A正确地创建B对象。另一方面,(2)的测试更合适,因为它们是受测试对象的本地测试。我应该使用哪一个?

    如果我使用(1),我如何添加不是特定于从服务器处理json消息的测试?假设我不仅可以从A类更新B,还可以更新C类。

    如果我使用(2),我如何确保在我的方法中处理服务器json,我正在调用正确的'updateWithData'调用?我听说测试'实施'这不是一件好事。 (在这种情况下很难测试该方法在模拟上被调用,除非我模拟B的初始化,这很痛苦。)

    写这两篇文章很乏味,更不用说重复测试了。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

序列化代码属于与模型本身分开的某个地方。 根据您的平台,您可以使用通用的反序列化器,使用模型注释进行调整。但是,我们假设您希望编写自己的代码。

然后我希望两种方法(填充B的方法和创建A并添加B的方法)位于单独的C类中,C类负责反序列化A和B. C将调用类B中的构造函数和setter方法以及A中的某种addB()方法。 C类的单元测试属于单独的CTest类。

如何测试这取决于反序列化的难易程度,但一种很好的方法是从JSON反序列化为A和B实例,然后从那里反向回JSON并检查结果是否保持不变。

有点事后的想法: 通常,在一个类的代码调用另一个类中的代码的情况下,您可以模拟第二个类以防止两次测试相同的代码。但我不建议将其用于POJO型号。