自定义yeoman生成器测试:创建文件

时间:2015-06-07 14:41:47

标签: javascript node.js mocha yeoman yeoman-generator

我有一个非常简单的yeoman生成器watchjs,它有Int个子生成器。以下是使用它:

speaker

主要有两个提示: $ yo watchjs:speaker You called the watch.js speaker subgenerator. ? Speaker file: data/speakers/speakers.json ? Speaker name: abc { file: 'data/speakers/speakers.json', name: 'abc' } Generated slug is: abc Trying to add: { "id": "abc", "name": "abc" } - 定义应附加数据的json文件和file - 定义要添加到文件中的实际数据(略微修改)。我试图为此编写一个简单的自耕农测试。我一直试图关注the docs,但我一直都在失败:

name

我无法理解文件实际创建的位置以及测试位置在哪里...似乎使用了临时窗口位置,但无论如何,如果所有内容都相对于路径正常工作,应该找到该文件而不是。无法弄清楚如何通过测试。

我的测试文件的最佳内容是:

$ npm test

> generator-watchjs@0.0.2 test c:\Users\tomasz.ducin\Documents\GitHub\generator-watchjs
> mocha

  Watchjs:speaker
{ file: 'speakers.json', name: 'John Doe' } // <- this is my console.log
    1) "before all" hook

  0 passing (59ms)
  1 failing

  1) Watchjs:speaker "before all" hook:
     Uncaught Error: ENOENT, no such file or directory 'C:\Users\TOMASZ~1.DUC\AppData\Local\Temp\53dac48785ddecb6dabba402eeb04f91e322f844\speakers.json'
      at Object.fs.openSync (fs.js:439:18)
      at Object.fs.readFileSync (fs.js:290:15)
      at module.exports.yeoman.generators.Base.extend.writing (c:\Users\tomasz.ducin\Documents\GitHub\generator-watchjs\speaker\index.js:43:33)

npm ERR! Test failed.  See above for more details.

我通过提示传递了特定的'use strict'; var path = require('path'); var assert = require('yeoman-generator').assert; var helpers = require('yeoman-generator').test; describe('watchjs:speaker', function () { before(function (done) { helpers.run(path.join(__dirname, '../speaker')) .withOptions({ 'skip-install': true }) .withPrompts({ 'file': 'speakers.json', 'name': "John Doe" }) .on('end', done); }); it('creates files', function () { assert.file([ 'speakers.json' ]); }); }); name名称。

我发现file调用了package.json&#39; npm test命令(以及它的命令)。但我不是摩卡的专家。

我在Windows7上使用节点v0.10.35。

1 个答案:

答案 0 :(得分:0)

首先,您应该在测试中使用绝对路径,因此文件的位置是可预测的。

我的测试看起来像这样:

'use strict';

var fs = require('fs');
var path = require('path');
var assert = require('yeoman-generator').assert;
var helpers = require('yeoman-generator').test;

describe('watchjs:speaker', function () {
  before(function (done) {
    var self = this;
    var name = 'John Doe';
    var testPath = path.join(__dirname, 'temp');

    // store in test obejct for later use
    this.filePath = path.join(testPath, 'speaker.json');

    helpers.run(path.join(__dirname, '../speaker'))
      .inDir(testPath)
      .withPrompts({ 'file': self.filePath, 'name': name })
      .withOptions({ 'skip-install': true })
      .on('end', done);
  });

  it('creates files', function () {
    assert.file(this.filePath);
    assert.fileContent(this.filePath, /\"id\":.*\"john-doe\"/);
    assert.fileContent(this.filePath, /\"name\":.*\"John Doe\"/);
  });

});

其次,与您的问题没有直接关系,上面的测试将在您共享的repo中的代码上。就像我在评论中提到的那样,如果文件已经存在,则会引发错误here

我会改变:

var content = JSON.parse(fs.readFileSync(this.options.file, 'utf8'));

为:

try {
  var content = JSON.parse(fs.readFileSync(this.options.file, 'utf8'));
} catch(e) {
  content = [];
}

通过上述更改,测试将通过。

相关问题