【问题标题】:which files to write tests in在哪些文件中编写测试
【发布时间】:2014-08-03 18:33:23
【问题描述】:

假设我有 Class a,它创建 Class b 的实例。假设 Class 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 有一个 B 类对象,该对象具有 prop1 == “prop1” \n
    • self.myObjects 有一个 B 类对象,该对象具有 prop2 == “prop2”
    • self.myObjects 有一个 B 类对象,该对象具有 prop3 == “prop3”
    • ...
  2. 当被测对象(B 类)通过一个对象获取 updateWithData 时

    • self.prop1 == @“prop1”
    • self.prop2 == @“prop2”
    • self.prop3 == @“prop3”

我喜欢 (1),因为当我开发 onNewJSONMessage 时,我可以在 updateWithData 中打出正确的行,并确保 A 正确地创建了 B 对象。另一方面,(2) 的测试更合适,因为它们对被测对象是本地的。我应该使用其中哪一个?

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

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

两者都写很乏味,更不用说重复测试了。有什么想法吗?

【问题讨论】:

    标签: unit-testing testing tdd


    【解决方案1】:

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

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

    如何测试这取决于反序列化的难度,但一个不错的方法是从 JSON 反序列化到 A 和 B 实例,然后再从那里返回到 JSON,并检查结果是否不变。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-25
      • 1970-01-01
      • 2013-06-28
      • 2018-03-13
      相关资源
      最近更新 更多