2016-12-16 11 views
2

私は現在、javascriptでテストスイートを実行する際にいくつかのコードを実装しようとしていますが、mochaを使用しているときに実際にデータを吐き出すのに問題があります。モカの副作用

何かを印刷しようとしたとき(またはファイルに書き込むとき)、私は成功しません。

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() 
    }) 
}) 

結果は、ファイルを作成する必要が

var Foo = require('./lib') 

Foo() 

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

lib.jsを

main.js:

は、サンプルについては、以下を参照してください。 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

本質的には、モカを使ってテストを実行する第三者のライブラリを計測しようとしています(テストは正常です)。私は実行時にデータを収集し、すべてのテストが実行された後にデータを出力する必要があります。私はテストの質に決して関心がありません。 – 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にそれを渡されました。私は真上lib.jsをテストしていますか

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(); 
     }); 
    }); 
}); 

注:最小限に正しいファイルをチェックします

テストはこれを行うだろう。それが単体テストの仕組みです。機能の最小単位をテストします。次に、main.jslib.jsによってエクスポートされた関数を呼び出すことを確認するテストを書くことができます。

+0

私はこれがよりうまく設計されていることに同意しますが、私が提供した例は最小限の例です(必ずしもモデル例ではありません)。正しい方向に私を指している@Artemからの回答を見てくださいが、問題を回避するために必要な詳細はわかりません。 – hamhut1066

+0

その答えは間違っています。これに関係する「スレッド」はありません。 – Louis

+0

その答えが間違っていると、イベントがなぜ決して発動しないのか説明できますか? – hamhut1066

関連する問題