2014-09-30 71 views
1

我使用Sails v0.10.x並在運行我的功能測試時遇到問題。使用Mocha和Grunt在Sails.js中運行功能測試時的競爭條件

測試/ bootstrap.test.js

// force the test environment to 'test' 
process.env.NODE_ENV = 'test'; 

var Sails = require('sails'); 

// use zombie.js as headless browser 
var Browser = require('zombie'); 

// Global before hook 
before(function(done) { 
    var self = this; 
    // Lift Sails and start the server 
    Sails.lift({ 
    log: { 
     level: 'error' 
    }, 
    }, function(err, sails) { 
    // initialize the browser using the same port as the test application 
    self.browser = new Browser({ site: 'http://localhost:1337', debug: false }); 

    done(err, sails); 
    }); 
}); 

// Global after hook 
after(function(done) { 
    Sails.lower(done); 
    this.browser.close(); 
}); 

問題是Sails.lift觸發默認咕嚕任務運行。此任務所做的一件事是清除公用文件夾,然後複製資產。

我遇到的問題是我的功能測試正在運行,而此複製仍在進行中。這意味着當我的無頭瀏覽器請求靜態資產時,我會得到大量的404錯誤(並且測試失敗)。

我猜可能有幾種解決方案

  • 添加新聞「帆舉」命令不清洗下來的公共文件夾(這可能部署後運行測試時,雖然會產生問題?)
  • 添加超時帆後發射了我的無頭瀏覽器之前提升(這看起來雖然哈克)
  • 某種回調/事件(不知道這是可能的嗎?)

什解決方案有其他人想出這個問題嗎?

回答

1

你可以嘗試提升在生產模式的應用:

Sails.lift({ 
    log: { 
     level: 'error' 
    }, 
    environment: 'production' 
}, function(err, sails) {...} 

在生產模式,帆未完成吊裝,直到所有的咕嚕任務完成。

如果這不是您的選擇(因爲您需要測試在具有特定設置的不同環境中運行),您可以傾聽hook:grunt:done事件,直到收到它爲止,纔開始測試。您需要關閉您正在運行測試的環境的「監視」任務(否則Grunt將永遠不會完成!)。這意味着如果你想保持你的開發環境的「監視」,你需要在不同的環境下運行測試(反正這是個好主意)。因此,首先在任務/註冊/ default.js

module.exports = function (grunt) { 
    var tasks = ['compileAssets', 'linkAssets']; 
    if (process.env.NODE_ENV !== 'test') {tasks.push('watch');} 
    grunt.registerTask('default', tasks); 
}; 

然後在您的測試:

var async = require('async'); 
async.parallel({ 
    // Set up a listener for grunt finish 
    listenForGrunt: function(cb) {sails.on('hook:grunt:done', cb);}, 
    // Lift sails 
    liftSails: function(cb) { 
    Sails.lift({ 
     log: { 
     level: 'error' 
     }, 
    }, function(err, sails) { 
     self.browser = new Browser({ site: 'http://localhost:1337', debug: false }); 
     cb(err, sails); 
    }); 
    } 
}, done); 

NODE_ENV=test mocha運行測試,或在您的的package.json下更好的scripts,放入:

"test": "NODE_ENV=test mocha" 

這樣你就可以運行npm test

這將確保done在Sails解除之前不會被調用 Grunt已完成。

+0

感謝您的回覆,但不幸的是這不起作用。在複製仍在進行的同時觸發完成。 – redeye 2014-10-03 10:03:18

+0

有趣 - 當我測試這個時,我無法完全調用「done」,因爲我意識到「watch」任務阻止了它。更新了我的答案,並提供了有關禁用「觀看」測試的信息。在我做完之後,這就像一個魅力。 – sgress454 2014-10-03 17:05:35