【问题标题】:How to Load a File for Testing with Jasmine Node?如何使用 Jasmine 节点加载文件进行测试?
【发布时间】:2012-03-15 05:42:09
【问题描述】:

我有一个简单的 JavaScript 文件 color.js 和一个匹配的规范文件 colorSpec.js

color.js:

function Color() 
{

}

colorSpec.js:

require('./color.js');

describe("color", function() {
  it("should work", function() {
    new Color(255, 255, 255);
  });
});

当我运行jasmine-node colorSpec.js 时,出现以下异常:

ReferenceError: Color is not defined

如何让 Jasmine 在运行 colorSpec.js 之前加载我的 color.js 文件?

【问题讨论】:

标签: javascript bdd jasmine


【解决方案1】:

您可以使用 require() 在 colorSpec.js 中加载您的 color.js。如果你不告诉茉莉花它们在你的规范文件中到底是什么,我看不出茉莉花是如何猜测所有依赖关系的。 编辑 : 一个快速而肮脏的解决方案,但也许有一些内置的 Jasmine 可以做到这一点:

fs = require('fs')
myCode = fs.readFileSync('./color.js','utf-8') // depends on the file encoding
eval(myCode)

那么你的课程应该可以与 jasmine 一起使用

如果你直接在你的文件上调用 require 我认为你需要创建一个模块并导出它

【讨论】:

  • 我尝试在我的规范文件顶部添加require('./color.js');,但我仍然收到RefereceError 异常。
  • 这行得通,但感觉node.js 应该有内置的东西来做到这一点。不过,感谢您的帮助。如果您遇到不同的实现方式,请告诉我。
  • 您好!我需要评估 Angular 或其他一些基于 DOM/浏览器的库,那我该怎么办?窗口在节点中不可用! :(
  • require('fs') 是做什么的?
【解决方案2】:

使用 Jasmine 节点时,您需要将对象/函数/类(在本例中为 Color)导出为节点模块。我喜欢尝试让我的模块同时在节点或浏览器中运行,如下所示:

文件夹结构:

js
  - src/
      color.js
  - spec/
      colorSpec.js

src/color.js

/**
 * class Color
 *
 * @constructor
 */
function Color(red, green, blue)
{
    var current = [red, green, blue];

    this.getCurrent = function ()
    {
        return current;
    }
}

// Export node module.
if ( typeof module !== 'undefined' && module.hasOwnProperty('exports') )
{
    module.exports = Color;
}

spec/colorSpec.js

var Color = require('../src/color.js');

describe("Test the Color object", function() {
    var color = new Color(255, 255, 255);

    it('to verify that it can return a color.', function() {
        expect(color.getCurrent()).toContain(255);
    });
});

【讨论】:

  • 谢谢。一个问题:我可以省略module 存在检查逻辑吗? module 什么时候可以成为undefined
  • 如果您从不打算在浏览器中运行它,那么可以。
  • 嗯,我尝试了这种方法,但我得到了TypeError: util.roundDecimal is not a function 唯一有效的方法是exports.roundDecimal = function,但我不能,因为我的脚本是由不是exports 的东西读取的是
  • 好像导出需要是一个对象module.exports = { roundDecimal: roundDecimal }
【解决方案3】:

这不是 require 的工作方式。你的color.js 需要定义/导出一些东西。我会假设你在这里使用 require.js 来保持理智。

color.js

define('Color', function (require) {
  var Color = function () {};
  return Color;
});

然后在您的规范中:

var Color = require('color.js');

【讨论】:

  • 我真的不打算使用require.js。我正在构建一个颜色库,我不想强​​制依赖于使用它的人。您的回答可能是公认的方法,但它不符合我的项目要求。
  • 感谢您的帮助。我很感激。
猜你喜欢
  • 1970-01-01
  • 2019-01-21
  • 2016-07-20
  • 1970-01-01
  • 1970-01-01
  • 2018-01-28
  • 2017-04-14
  • 2012-10-31
  • 1970-01-01
相关资源
最近更新 更多