【问题标题】:Grunt-Karma: Use Node.js fs-framework in Jasmine TestfileGrunt-Karma:在 Jasmine 测试文件中使用 Node.js fs-framework
【发布时间】:2013-09-06 14:53:46
【问题描述】:

我正在使用 Jasmine 框架编写单元测试。

我使用 Grunt 和 Karma 运行 Jasmine 测试文件。

我只是想在我的本地文件系统(例如 example.xml)上加载文件的内容。

我认为我可以做到这一点:

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

这在我的 Gruntfile.js 甚至我的 karma.conf.js 文件中运行良好,但在我的 茉莉花文件。我的测试文件如下所示:

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

我得到的第一个错误是:

'ReferenceError: require is not defined'.

不知道为什么我这里不能用RequireJS,因为我可以用 在 Gruntfiel.js 甚至在 karma.conf.js?!?!?

好的,但是当手动将 require.js 添加到 karma.conf.js 文件中的 files-property 时, 然后我收到以下消息:

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

使用 requirejs 的数组语法,什么都不会发生。

我猜想在运行 Jasmine 时无法访问 Node.js 功能 使用 Karma 的测试文件。那么当 Karma 在 Node.js 上运行时,为什么无法访问 Nodejs 的“fs”框架?

欢迎任何评论/建议。 谢谢。

【问题讨论】:

    标签: node.js jasmine gruntjs karma-runner fs


    【解决方案1】:

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

    【讨论】:

    • 你是我的英雄,因为你对后端有一些经验
    【解决方案2】:

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

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

    在我的 karma.conf.js 中。

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

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

    【讨论】:

      【解决方案3】:

      我认为您在这里忽略了单元测试的要点,因为在我看来您正在将应用程序逻辑复制到您的测试套件中。这使单元测试的意义无效,因为它应该做的是通过测试套件运行现有功能,而不是测试 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();
          });
      });
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-04-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多