繁体   English   中英

我对该方法进行单元测试有哪些选择?

[英]What Are My Options For Unit-Testing This Method?

我的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依赖项有哪些选择? 我没有看到如何合理地对其进行存根,但是对存根进行存根并一次仅测试一种方法是单元测试的重点。

单元测试选项:

第一种选择:
只需将Vector3f对象传递给Ray.o,Ray.d

优点:
- 简单。

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

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

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

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

我不确定最后一个缺点是否是一个问题-如果Vector3f通过所有的单元测试,那么它正在遵守与系统其他组件的合同,因此我们永远都不会看到Vector3f的测试全部通过的情况,但它会导致其他组件损坏。 此外,这是集成级别的问题,而不是单元级别的问题。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM