咕噜+ mochaTest:更改工作目录?

我正尝试使用grunt-mocha-test来实现对我的nodejs-project 的testing,并且遇到了不同的/不正确的path问题。

就像我在别处看到的一样,我想通过只需要我的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与它应该是不同的。

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

只要我知道自己做错了什么,我就会澄清这个头衔。

谢谢。

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

当你require("./blah") , 被解释为意味着“从当前模块的path开始”。 由于这是相对于当前所在的模块而言的,因此取决于模块的位置,它将parsing为不同的值。

当你运行process.cwd()这将返回进程的当前工作目录。 这不会因模块改变。 当你的代码调用process.chdir()时,它会改变。 另外,当您执行使用的文件系统操作时. ,这是相对于process.cwd()解释的。

所以你从process.cwd()得到C:\path\project并不奇怪,因为这是你通常运行Grunt(即在你的项目的顶层)的地方。 如果你想要相对于模块的path,你可以做什么是使用__dirname 。 例如,这段代码从包含这段代码的模块所在的同一位置的foo子目录读取文件:

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