私は、私たちにjavascriptスクリプトが組み込まれたエンタープライズツールを使って作業しています。これらのスクリプトは、特定のビルトインオブジェクトにアクセスできます。JavaScriptで模擬オブジェクトを使用したユニットテスト
残念ながら、これらのスクリプトを単体テストするツールはありません。だから、私の考えは、スクリプトをリポジトリに保持し、組み込みのオブジェクトをモックし、私のシステム上で実行される単体テストをセットアップすることでした。
JavaScriptは、ビルド、クラスローディングなどの点でJavaScriptがどのように機能しているかわかりませんが、私は物事を試していて、何が動作しているか見てきました。私はモカをノードプロジェクトにすることから始めました(実際のノードプロジェクトではなく、スクリプトで構成されたディレクトリでも)。デフォルトのテストは機能しますが、自分のコードから関数をテストしようとすると、コンパイラエラーが発生します。
私のプロジェクトのサンプルスクリプトは次のようになります。私は(「必要」)をインポートするとき
var assert = require('assert');
var sampleScript = require('../scripts/sampleScript.js');
describe('SampleScript', function() {
describe('#doStuff()', function() {
it('should do stuff', function() {
assert.equal(-1, sampleScript.doStuff("input"));
});
});
});
問題が起こるのスクリプトを:
var thing = builtInObject.foo();
doStuff(thing);
doMoreStuff(thing);
function doStuff(thing) {
// Code
}
function doMoreStuff(thing) {
// More Code
}
ここでテストファイルは次のようになります。私は、スクリプト全体は、機能をテストするためではない願っています。私はそれがbuiltInObjectをしないので、コンパイルエラーを取得します。モックでオブジェクトに組み込まれたものを「注入」できる方法はありますか?だから私はそれらのオブジェクトが含む変数と関数を定義し、コンパイラはそれらが何であるか知っていますか?
私は代わりのフレームワークやアイデアを開いています。私の無知に申し訳ありません、私は本当にjavascriptの男ではありません。そして、これは少しハッキリですが、私はエンタープライズツールから抜け出せないので、これは最善の選択肢のようです。
おかげで、あなたのアプローチは大部分のために私のために働く!カップルの質問には、 1が続きます。クラスをあらかじめ定義することはできますか? "var builtInClass = new BuiltInClass();"のようなコードがあります。同じように。 2.関数return(JavaMockitoでthenReturn()のように)をモックすることはできますか? doMoreStuffをテストしているときにdoStuffが実際に呼び出されるのは嫌ですが、戻り値が必要な場合があります。 @ antonio-narkevich – user2014969
私は#2を考え出したと思います。 sinon.stubを使用して、doStuff()の戻り値をモックすることができます。問題は、私のコードが今書かれているように、関数を嘲笑したり、require()で失敗したりする必要があるということです。そして機能を嘲笑することは、必要性の後に起こる必要があります。私はこれを回避するために私のコードをリファクタリングできるかもしれないと思う。編集:はい、私は方法を考え出した。これを私のコーディング思考プロセスブログに変えて申し訳ありません。 – user2014969
ねえ男。 #1について。おそらく、あなたはgloba.BuiltInClass = function(){}のようなことをすることができるでしょう。あなたは大丈夫でしょう。 :) –