3

I'm writing unit-tests with the Jasmine-framework.

I use Grunt and Karma for running the Jasmine testfiles.

I simply want to load the content of a file on my local file-system (e.g. example.xml).

I thought I can do this:

var fs = require('fs');
var fileContent = fs.readFileSync("test/resources/example.xml").toString();
console.log(fileContent);

This works well in my Gruntfile.js and even in my karma.conf.js file, but not in my Jasmine-file. My Testfile looks like this:

describe('Some tests', function() {
    it('load xml file', function() {
        var fs = require("fs");
        fileContent = fs.readFileSync("test/resources/example.xml").toString();
        console.log(fileContent);
    });
}); 

The first error I get is:

'ReferenceError: require is not defined'.

Does not know why I cannot use RequireJS here, because I can use it in Gruntfiel.js and even in karma.conf.js?!?!?

Okay, but when manually add require.js to the files-property in karma.conf.js-file, then I get the following message:

 Module name "fs" has not been loaded yet for context: _. Use require([]) 

With the array-syntax of requirejs, nothing happens.

I guess that is not possible to access Node.js functionality in Jasmine when running the testfiles with Karma. So when Karma runs on Node.js, why is it not possible to access the 'fs'-framework of Nodejs?

Any comment/advice is welcome. Thanks.

4

3 回答 3

8

您的测试不起作用,因为 karma - 是客户端 JavaScript(在浏览器中运行的 JavaScript)的测试运行程序,但您想用它测试 node.js 代码(在服务器部分运行)。所以业力不能运行服务器端测试。您需要不同的测试运行程序,例如查看jasmine-node.

于 2013-10-13T16:15:05.423 回答
1

由于这首先出现在 Google 搜索中,因此我收到了类似的错误,但没有在我的项目中使用任何 node.js 样式的代码。原来错误是我的凉亭组件之一有一个完整的副本,jasmine包括它的node.js 样式代码,我有

{ pattern: 'src/**/*.js', included: false },

在我的 karma.conf.js 中。

所以不幸的是,Karma 没有为这类事情提供最好的调试,在没有告诉你哪个文件导致问题的情况下把你甩了出去。我必须将这种模式分解到各个目录才能找到违规者。

无论如何,请小心安装 bower,它们会将大量代码放入您可能并不真正关心的项目目录中。

于 2014-11-20T21:17:06.127 回答
0

我认为您在这里错过了单元测试的重点,因为在我看来,您正在将应用程序逻辑复制到您的测试套件中。这使单元测试的意义无效,因为它应该做的是通过测试套件运行现有功能,而不是测试 fs 是否可以加载 XML 文件。在您的场景中,如果您的 XML 处理代码在源文件中被更改(并引入了错误),它仍然会通过单元测试。

将单元测试视为一种通过大量样本数据运行函数以确保它不会中断的方法。设置您的文件阅读器以接受输入,然后简单地在 Jasmine 测试中:

describe('My XML reader', function() {
    beforeEach(function() {
        this.xmlreader = new XMLReader();
    });
    it('can load some xml', function() {
        var xmldump = this.xmlreader.loadXML('inputFile.xml');
        expect(xmldump).toBeTruthy();
    });
});

测试在您正在测试的对象上公开的方法。不要为自己做更多的工作。:-)

于 2013-09-07T21:02:43.720 回答