【问题标题】:What Are My Options For Unit-Testing This Method?我对这种方法进行单元测试的选项是什么?
【发布时间】:2012-09-16 03:23:54
【问题描述】:

我的光线模块:

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 依赖项有哪些选择?我不知道如何合理地将其存根,但存根依赖项并一次只测试一种方法是单元测试的重点。

【问题讨论】:

  • 这是什么魔法?

标签: javascript unit-testing dependencies stub raytracing


【解决方案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 的依赖已被破坏。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-01
    相关资源
    最近更新 更多