2017-04-05 38 views
4

我正試圖用MongodB學習一種測試驅動方法。文件夾結構摩卡如何知道在測試套件中首先加載哪個文件

enter image description here

user.js src文件夾中

const mongoose = require('mongoose'); 
mongoose.Promise = require('bluebird'); 
const Schema = mongoose.Schema; 

const UserSchema = new Schema ({ 
    name: String 
}); 

const User = mongoose.model('user', UserSchema); 

module.exports = User; 

含量test_helper.js

const mongoose = require('mongoose');; 

mongoose.connect('mongodb://localhost/users_test'); 

    mongoose.connection 
    .once('open',() => { 
     console.log('Connected to Mongo!'); 
     done()}) 
    .on('error', (error) => { 
     console.warn('Warning', error); 
    }); 

create_test.js內容

const assert = require('assert'); 
const User = require('../src/user'); 

describe('Creating records',() => { 

    it('Saves a user', (done) => { 
     const user = new User({ name: 'Ankur' }); 
     user.save() 
       .then(() => { 
        assert(!user.isNew); 
        done(); 
       }); 
測試

現在,當我運行npm test測試正在通過。

Connected to Mongo! 
    Creating records 
    √ Saves a user (779ms) 

但我的疑問是如何Mocha知道先運行test_helper.js文件,每次。 (將該文件命名爲任何其他名稱也不會改變行爲)。

而且我不使用任何根級別掛鉤。

我知道摩卡將文件加載遞歸在每個目錄,從根目錄,因爲這裏的一切都僅僅是一個目錄,以便它不是在這裏做任何區別。

有人可以請建議或幫助,摩卡如何知道test_helper.js(或任何具有相同內容的文件名)應該先運行。

回答

6

沒有默認設置以摩卡如何加載測試文件。

當摩卡scans a directory找到它的文件吧,它使用fs.readdirSync。此電話是圍繞readdir(3)的包裝,本身不保證訂單。現在,由於implementation quirkfs.readdirfs.readdirSync輸出上的Linux(和一般的大概POSIX系統),但不能在Windows排序。此外,Linux上的排序行爲可能最終被刪除,因爲文檔中說fs.readdir只是readdir(3),而後者不能保證順序。有一個很好的論點可以說,在Linux上觀察到的行爲是一個錯誤(請參閱上面鏈接的問題)。

注意,有一個--sort選項摸查發現他們後,將文件排序。但是這是默認關閉的。

您觀察到的行爲不僅僅是通過加載訂單,而是通過執行訂單來解釋。這裏是發生了什麼:

  1. 摩卡加載測試文件並執行它們。因此,任何位於文件頂層的文件都會立即執行。這意味着test_helper.js中的代碼立即執行。每撥打describe立即執行回撥。 但是,致電it記錄測試以供以後執行。摩卡是發現你的測試,而不是執行他們馬上。

  2. 一旦所有文件都被執行,Mocha開始運行測試。此時,test_helper.js中的代碼已經運行,您的測試將從其創建的連接中受益。

主要警告連接到數據庫是一個異步操作,目前沒有什麼保證了測試開始之前test_helper.js異步操作都將完成。它現在正常運行只是運氣。

如果這是我,我會把連接創建放在全局異步before鉤子中。 (出現在任何測試文件中的全球before鉤子將之前的任何測試任何執行,甚至出現在其他文件。測試),否則我use --delay,並明確調用run()啓動套件的連接被保證之後被製造。

+0

謝謝你這麼詳細的回答。我已經把它放在鉤子之前。它只是沒有鉤之前也測試條件顯示這種行爲..對我來說是令人驚訝 –

+0

啊,是的,如果它是在一個全球'之前'鉤,你避免了我描述的問題。它也符合我解釋的行爲。必須在任何測試之前執行'before'鉤子。它不依賴於加載順序。 – Louis

+0

fs.readdir和fs.readdirSync在Linux上進行排序..如果我可以投兩次就完成了。因爲在你回答PeterMüller(https://github.com/Munter)之前,摩卡貢獻者..回答了這個問題,我仍然在閱讀文檔,看看它是如何按字母順序加載文件的「並且你回答了相同 –

0

它不

測試不應該有一個特定的順序。 所有測試套件都應該作爲獨立於其他套件的獨立工作。在套件內部,您可以使用「之前」和「之前」(或「之後」,「之後」)來創建設置和拆卸步驟。

但如果測試事項的順序,一些在設計打破。

+1

在摩卡的配置文件,您可以指定所有測試開始之前,其JavaScript文件應該被加載,這就是你把你的幫助文件。 – eavichay

+0

沒有其他配置完成。除了安裝和「腳本」:在package.json中,''mocha' }',create_test.js需要mongodb連接才能通過,這不是關於測試套件。獨立行爲 –

+0

@AnkurAnand This答案是正確的,mocha不知道哪個文件首先加載,這只是巧合。 – Creynders

-1

有一個非常簡單的方法來順序加載測試。

步驟1:在package.json中設置一個測試腳本:

"scripts": { 
    "test": "mocha ./tests.js" 
    } 

讓我們假設tests.js是一個文件,它定義了執行測試的順序。

require("./test/general/test_login.js"); 
require("./test/Company/addCompany.js"); 
... 
... 

所以這裏test_login將由一個先一個人跑。

第二步:運行與測試:

$ npm test 
相關問題