我的选择单元测试方法是什么?

时间:2012-09-15 17:42:22

标签: javascript unit-testing dependencies stub raytracing

我的Ray模块:

define(['Util', 'Vector3f'], function (Util, Vector3f) {
  var Ray = {}
  Ray.o = null;
  Ray.d = null;
  Ray.depth = 0;
  Ray.mint = 0.03;
  Ray.maxt = null;
  return Ray;
});

我的单元测试:

describe(".moveAlong(Number t)", function(){
  it("returns a point at distance t in the direction of the ray", 
  function(){
    expect(4).toBe(null); //unimplemented unit test always fails
  });
});

Ray.o是射线的起源。 Ray.d是射线的方向。我希望Ray.moveAlong(t)返回一个点q,使q = o + d * t。

我对单元测试的理解是,如果我实际上将我的Vector3f模块包含在我的单元测试中,这样我就可以给Ray一个原点和一个方向,我实际上是在进行集成测试。但是我需要来自我的Vector3f模块的add()和mulScalar()方法,以便在moveAlong(t)中计算ray.d + ray.d * t。

我在这里处理我的Vector3f依赖项有哪些选择?我不知道如何合理地将其删除,但是一次性地删除依赖关系并仅测试一种方法就是单元测试的重点。

1 个答案:

答案 0 :(得分:1)

单元测试选项:

第一个选项:
只需为Ray.o,Ray.d传递Vector3f对象

优点:
- 很容易。

缺点:
- 保持测试中的依赖性 - 对不在此测试下的组件(Vector3f)的更新可能需要更新此测试。

第二种选择:
创建存根Vector3fs,每个都只实现Vector3f模块的add(Vector3f v),mulScalar(Number t)方法。这在Javascript中非常简单,因为引用是无类型的,并且具有正确方法的任何对象都可以替换“正确”对象。这让我觉得尝试将OOP纳入这个项目是一个坏主意,但我不确定如何处理这个问题,这是另一个问题的主题。

优点:
- 在测试代码中打破Ray和Vector3f之间的依赖关系,因此对Vector3f的进一步更改不会导致Ray失败的单元测试,如果某些东西中断Vector3f,则会减少要检查的失败测试的数量。

缺点:
- 测试中的更多代码 - 如果Vector3f的更改方式允许它通过所有单元测试,但会破坏Ray的功能,那么我们也不会在Ray单元测试中看到它,因为对Vector3f的依赖已被破坏。

我不确定最后一个问题是什么 - 如果Vector3f正在通过它的所有单元测试,那么它就是遵守与系统其他组件的合同,所以我们不应该看到Vector3f测试的情况全部通过,但它会导致其他组件中断。此外,这是一个集成级问题,而不是单元级问题。

我认为第二种选择是要走的路。

相关问题