【发布时间】: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;
// ...
}
}
暂时忽略这种伪语言,只专注于测试,我有两种方法可以测试它。
-
当被测对象(A 类)通过一个对象获取 onNewJSONMessage 时,
- self.myObjects 有一个 B 类对象,该对象具有 prop1 == “prop1” \n
- self.myObjects 有一个 B 类对象,该对象具有 prop2 == “prop2”
- self.myObjects 有一个 B 类对象,该对象具有 prop3 == “prop3”
- ...
-
当被测对象(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