2016-12-16 72 views
2

我目前正試圖在JavaScript中運行測試套件時測試一些代碼,但在使用摩卡時實際上吐出數據時遇到了問題。摩卡的副作用

這似乎是當我嘗試打印出某些東西(甚至寫入文件)時,我沒有成功。

請參見下面的示例:

main.js

var Foo = require('./lib') 

Foo() 

module.exports = function(a) { return a + 1} 

lib.js

var fs = require('fs') 
module.exports = function() { 
    setTimeout(function() { 
    fs.writeFile('test_file', 'hello world', function(){}) 
    console.log('hello finished') 
    }, 1000) 
    console.log('hello begin') 
} 

test.js

var x = require('./main') 
describe("some test", function() { 
    it("should do something", function(done) { 
    done() 
    }) 
}) 

結果應該創建一個文件命名爲test_file機智h hello world的內容。

我創建了一個存儲庫,其中包含可輕鬆克隆和測試的完整示例。

https://github.com/hamhut1066/mocha-mockup

回答

0

在您的測試文件,要導入main。但main只是您在main.jsfunction(a) { return a + 1}中輸出的內容。

,你應該導出整個文件:

var Foo = require('./lib') 

module.exports = function(a) { 
    Foo(); 
    return a + 1; 
} 
0

Duno摩卡究竟是如何工作的(即如何管理用於測試的線程池,甚至它有池),但它看起來像摩卡試驗後殺死線程共完成。

所以setTimeout不會因爲線程已經死掉而觸發事件。

(同時的setTimeout(...,1)將觸發事件 - 試試吧)

+0

乾杯,這就是我一直在尋找的。你不知道如何讓摩卡停止殺死線程嗎? – hamhut1066

+0

不,聽起來像'如何打破摩卡'。至於我,它看起來像你有不好的設計測試 - 我的意思是如果你想在等待一段時間後檢查一些東西,那麼你應該做的()你測試,直到那。 –

+0

本質上,我試圖用儀器來運行摩卡運行測試的第三方庫(測試是理智的)。我想在運行時收集數據,然後在所有測試運行後將其輸出到stout。我絕不關心測試的質量。 – hamhut1066

0

問題的根源是,僅僅使用done像你這樣是行不通的。摩卡得到你的測試,執行它,done被稱爲馬上。所以摩卡認爲它完成並退出。

還有一個事實,即lib.js設計不好。您可以實現像這樣代替:

const fs = require('fs'); 
module.exports = function(cb) { 
    setTimeout(function() { 
     fs.writeFile('test_file', 'hello world', cb); 
     console.log('hello finished'); 
    }, 1000); 

    console.log('hello begin'); 
}; 

我剛加入的cb參數導出的功能,並將其傳遞給fs.writeFile

一個測試,將最低限度檢查正確的文件這樣做:

const fs = require("fs"); 
const lib = require("./lib"); 
const assert = require("assert"); 
describe("some test", function() { 
    it("should do something", function(done) { 
     lib(function (err) { 
      if (err) { 
       done(err); 
      } 

      fs.readFile("./test_file", function (err, data) { 
       if (err) { 
        done(err); 
       } 

       assert.equal(data, "hello world"); 
       done(); 
      }); 
     }); 
    }); 
    after(function (done) { 
     fs.unlink("./test_file", function() { 
      // We don't want a cascading failure here if the test 
      // above failed to create the file so we ignore errors 
      // here. 
      done(); 
     }); 
    }); 
}); 

注意如何我直接在上面測試lib.js。這就是單元測試的工作原理。測試最小單位的功能。然後你可以編寫一個測試來檢查main.js調用lib.js導出的函數。

+0

雖然我同意這是更好的設計,我提供的例子是一個最小的例子(不一定是一個模型的例子)。請看@Artem的回答,他指出我的方向正確,但不知道解決問題所需的全部細節。 – hamhut1066

+0

該答案不正確。這其中沒有「線索」涉及。 – Louis

+0

如果答案不正確,那麼你能解釋爲什麼這個事件永遠不會發生? – hamhut1066