2014-10-06 153 views
1

我正在使用Yeoman生成一些項目和咕嚕任務。 現在我還想使用Mocha測試生成的咕嚕任務,但我只找到一些信息如何在咕嚕聲中使用Mocha測試;-)測試咕嚕任務

任何人都可以幫忙嗎?

+0

你想要做什麼,你*做不到? Grunt任務通常在命令行中調用。摩卡測試可以用來測試命令行工具。您的Grunt任務由Yeoman生成。據推測,這些都是文本文件。摩卡測試可以讀取文本文件並檢查是否如預期的那樣。那麼你究竟做了什麼呢? – Louis 2014-10-06 11:21:39

回答

1

不是一個優雅的解決方案,但我採取了安裝我的依賴關係(npm install)的方法,從而運行相應的grunt任務(例如grunt less),然後在該操作後編寫測試邏輯。我已經使用嵌套exec調用此。

describe('less grunt tasks tests', function() { 
    var prompts = { 
     workFolder: 'temp', 
     fiddleDesc: 'mocha test' 
    }; 
    var testGlobal = {}; 
    beforeEach(function(done) { 
     testGlobal.app = helpers.run(path.join(__dirname, '../app')) 
     .inTmpDir(function(dir, err) { 
      if(err) { done(err); return; } 
      testGlobal.dir = dir; 
      // console.log(dir); 
     }) 
     .withArguments(['skip-install']) 
     .withOptions({ less: true }) 
     .withPrompts(prompts) 
     .on('end', function(){ 
      done(); 
     }); 
    }); 

    it('should modify app/styles/style.css', function(done){ 
     this.timeout(60000 * 10); //10 minutes - my network is f**ked up 
     var opts = { 
     cwd : testGlobal.dir, 
     env: process.env, 
     detached: true 
     }; 
     var gen = testGlobal.app.generator; 
     var devdeps = gen.devDependencies.join(' '); 
     var rootPath = testGlobal.dir; 
     var getPath = function(fpath) { 
     var s = path.join(rootPath, fpath); 
     // console.log(s); ; 
     return s; 
     }; 

     exec('npm install ' + devdeps, opts, function(err, stdout, stderr) { 
     if(err) { 
      done(err); 
      return; 
     } 

     var h1 = fs.readFileSync(getPath('app/less/h1.less'), 'utf8'); 
     var css = fs.readFileSync(getPath('app/styles/style.css'), 'utf8'); 
     // expect(css).to.not.contain(h1); 
     expect(css).to.not.contain('h1'); 

     exec('grunt less', opts, function(e, out, serr){ 
      if(e) { 
      done(e); 
      return; 
      } 
      // console.log(out); 

      var h1 = fs.readFileSync(getPath('app/less/h1.less'), 'utf8'); 
      var css = fs.readFileSync(getPath('app/styles/style.css'), 'utf8'); 
      // expect(css).to.contain(h1); //this expect fails since for some reason \r are stripped out 
      expect(css).to.contain('h1'); 
      done(); 
     }); 
     }); 
    }); 
    }); 

有關更多參考,您可以在我參與的repo中看到更多測試代碼。 Ps:我很感激你對我採取的方法發表的意見。