2012-09-15 75 views
1

我雷模块:什么是我的选择单元测试这种方法?

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依赖的选项是什么?我看不出如何合理地将其存储,但是一次只测试一种方法是单元测试的关键。

+0

这是什么样的魔法? – Sebas

回答

1

单元测试选项:

第一种选择:
只是通过在Ray.o Vector3f对象,Ray.d

优点:
- 易。

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

第二选项:
创建存根Vector3fs,每个只实现Vector3f模块的add(Vector3f v),mulScalar(Number t)方法。这在Javascript中非常容易,因为引用是无类型的,任何具有正确方法的对象都可以替代“正确”对象。这让我觉得试图让OOP加入这个项目是一个不好的主意,但我不太确定如何解决这个问题,这是另一个问题的主题。

优点:
- 在测试代码Ray和Vector3f间休息的依赖,这样就Vector3f进一步的变化将不会在雷失败的单元测试,这减少了失败的测试数量的结果,如果东西坏了Vector3f进行检查。

缺点:
- 测试中的更多代码。
- 如果Vector3f以允许其通过所有单元测试的方式进行更改,但会中断Ray的功能,那么我们也不会在Ray单元测试中看到它,因为Vector3f的依赖性已被破坏。我不确定最后一个问题是否是一个问题 - 如果Vector3f正在通过所有的单元测试,那么它会服从它与系统其他组件的契约,所以我们不应该看到Vector3f的情况测试全部通过,但会导致其他组件中断。此外,这是一个集成级别的问题,而不是单位级别的问题。

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

相关问题