2017-01-25 17 views
0

私は、私たちに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

もし正しく取得されたら、Node.js環境のfrontenedファイルの単体テストを行いたいと思います。

いくつかの合併症があります。

まず、Node.jsに関して、各ファイルには独自のスコープがあるため、ファイル内で定義された変数にはファイルが必要な場合でもアクセスできません。だからあなたはそれらを使うためにvarsをエクスポートする必要があります。

module.exports.doStuff = doStuff; //in the end of sample script 

第二に、あなたはあなたがエラーを取得しますので、彼らは未定義ことでしょうフロントエンドに必要/ module.exportsはのようなものを使用して開始します。

コードを実行する最も簡単な方法は次のとおりです。サンプルスクリプトの内部:

var isNode = typeof module !== 'undefined' && module.exports; 
if (isNode) { 
    //So we are exporting only when we are running in Node env. 
    //After this doStuff and doMoreStuff will be avail. in the test 
    module.exports.doStuff = doStuff; 
    module.exports.doMoreStuff = doMoreStuff; 
} 

builtInObjectとは何ですか?それを模擬する簡単な方法は、要求が次のようになる前にテストの中に入ります:

global.builtInObject = { 
    foo: function() { return 'thing'; } 
}; 

テストは私のために渡されました。 the sourcesを参照してください。

とにかくグローバル変数が正しくありません。しかし、この場合、あなたはそれらを使用することを避けることはできないようだ。

また、カルマのような設定を行うことでNode.jsの使用を避けることができます。これは物理的にブラウザを起動し、そこでテストを実行します。 :)

+0

おかげで、あなたのアプローチは大部分のために私のために働く!カップルの質問には、 1が続きます。クラスをあらかじめ定義することはできますか? "var builtInClass = new BuiltInClass();"のようなコードがあります。同じように。 2.関数return(JavaMockitoでthenReturn()のように)をモックすることはできますか? doMoreStuffをテストしているときにdoStuffが実際に呼び出されるのは嫌ですが、戻り値が必要な場合があります。 @ antonio-narkevich – user2014969

+0

私は#2を考え出したと思います。 sinon.stubを使用して、doStuff()の戻り値をモックすることができます。問題は、私のコードが今書かれているように、関数を嘲笑したり、require()で失敗したりする必要があるということです。そして機能を嘲笑することは、必要性の後に起こる必要があります。私はこれを回避するために私のコードをリファクタリングできるかもしれないと思う。編集:はい、私は方法を考え出した。これを私のコーディング思考プロセスブログに変えて申し訳ありません。 – user2014969

+0

ねえ男。 #1について。おそらく、あなたはgloba.BuiltInClass = function(){}のようなことをすることができるでしょう。あなたは大丈夫でしょう。 :) –

関連する問題