grunt + mocha测试:更改工作目录?

时间:2014-08-29 10:49:36

标签: node.js gruntjs mocha

我正在尝试使用grunt-mocha-test为我的nodejs-project实施测试,并且遇到不同/不正确路径的问题。

就像我在其他地方看到的那样,我希望通过只需要我的server.js来获得所有的依赖。

gruntfile.js

mochaTest: {
  test: {
    options: {
      reporter: 'spec',
      require: 'app/server.js'
    },
    src: ['app/test/**/*.js']
  }
}

我目前的项目结构如下所示

gruntfile.js
app/server.js
app/models/..
app/controllers/..
app/tests/..

users.controller.test.js

var userCtl = require('../controllers/users.controller');

describe("return5", function () {
  it("should return 5", function () {
    var result = userCtl.return5(null, null);
    expect(result).toBe(5);
  });
});

users.controller.js

var mongoose = require('mongoose');
var User = mongoose.model('User'); // <- Mocha crash: Schema hasn't been registered for model "User".
..

server.js我使用:

..
// config.js: https://github.com/meanjs/mean/blob/master/config/config.js
config.getGlobbedFiles('./models/**/*.js').forEach(function (path) {
  require(path); // never called with mochaTest
});
..
console.log(process.cwd()); // "C:\path\project" (missing /app)
..

所以cwd与它应该是不同的。

有人可以帮我解决这个问题吗?

一旦我知道自己做错了什么,我就会澄清标题。

谢谢。

1 个答案:

答案 0 :(得分:3)

混淆是由于模块路径和文件系统路径之间的差异。

执行require("./blah")时,.被解释为&#34;从当前模块的路径开始#34;。由于这与您当前所在的模块有关,因此它将根据模块的位置解析为不同的值。

当您运行process.cwd()时,这将返回流程的当前工作目录 。这样做从模块更改为模块。当您的代码调用process.chdir()时,它会发生变化。此外,当您执行使用.的文件系统操作时,这将相对于process.cwd()进行解释。

因此,您从C:\path\project获得process.cwd()并不奇怪,因为您通常会运行Grunt(即在项目的顶层)。如果您想要相对于模块的路径,您可以使用__dirname。例如,此代码从包含此代码的模块所在的同一位置的foo子目录中读取文件:

var path = require("path");
var fs = require("fs");

var subdir = path.join(__dirname, "foo");
var foofiles = fs.readdirSync(subdir);