2016-09-09 3 views
1

角度jsファイルの変数の単体テストを書く方法。文が関数内にカプセル化されていない変数とコードをテストするjavascriptユニット

if(testVar){ 
    // how do I test this code? 
    } 

を実行する場合、私は関数内であれば全体をカプセル化し、リターンを通してそれを渡す必要があります前に、私はtestVarに値を割り当てない方法

fooFactory.spec.js 
.. 
describe('test fooFactory', function(){ 
    it('test if statement', function(){ 
     expect(?).toBe(?); 
     // how to write a test to pass values to testVar 
     // testVar runs before I can assign value to it. 
     // even if I have setters and getters how can I retest the if statement 
    }); 
}); 
.. 

fooFactory.js 
(function() { 
    angular.module('MyApp').factory('fooFactory', fooFactory); 
    function fooFactory(someOtherFile){ 
     var testVar = someOtherFile.someOtherfunc; 

     if(testVar){ 
     // want to test this code. has 10 line of code 
     } 
     ... 
     function foo(){ 
     //does something and I can test this 
     } 
     ... 
     return { 
     foo:foo 
     } 
    } 
})(); 

bar(); 
    function bar(data){ 
    if(data){ 
     testVar = data; 
    } 
    if(testVar){ 
     // how do I test this code? 
    } 
    } 
    return { 
    foo: foo, 
    bar: bar 
    } 

これを行うより良い方法がありますか? jsファイルにセッターとゲッターが最初にあるはずですか?ありがとう

+0

混乱のために 'if(testVar){' – jcubic

+0

@jcubic sryの中にあるものに依存します。実際には、内部のコードをテストできるようにtestVarに値を渡したいと思っています。 – patz

答えて

1

someOtherFile(これは私が正しくサービスを理解している場合)をfooFactoryに挿入する必要があります。

ですから、someOtherFile

describe('test fooFactory', function(){ 
    var fooFactory; 
    beforeEach(function(){ 
     fooFactory = new FooFactory(
      { someOtherfunc: function() { return true; } } 
     ); 
     stateChangeCallback = $rootScope.$on.calls.first().args[1]; 
    }); 

    it('test if statement', function(){ 
     expect(fooFactory).toBe(?); 
     // how to write a test to pass values to testVar 
     // testVar runs before I can assign value to it. 
     // even if I have setters and getters how can I retest the if statement 
    }); 
}); 

completlyモックとしたい場合は、someOtherFileを必要としますが、そのすべての応答を模擬したくない場合は、何を行うことができますが使用され、あなたのテストでこのような何かを持っていますこのサービスを注入するために角度依存性注入を行い、その後にはsomeOtherfuncだけをモックします。これは次のようになります。

describe('test fooFactory', function(){ 
    var fooFactory; 
    var someOtherFile; 

    beforeEach(inject(function (
     _someOtherFile_ 
    ) { 
     someOtherFile = _someOtherFile_; 
     fooFactory = new FooFactory(
      someOtherFile 
     ); 
    })); 

    it('test if statement', function(){ 
     spyOn(someOtherFile, 'someOtherfunc').and.returnValue(true); 
     expect(?).toBe(?); 
     // how to write a test to pass values to testVar 
     // testVar runs before I can assign value to it. 
     // even if I have setters and getters how can I retest the if statement 
    }); 
}); 
+0

ありがとう、これは私がsomeOtherfuncから得た値を気にするなら意味がありますが、もし私がいなくて、ちょうど 'testVar'の値をいくつかのランダムな値に設定したいのであれば。 その場合、私はセッターを持ってそれを前に呼び出す必要があると思いますか? – patz

+0

ありがとう私はそれを試してみます – patz

+0

'testVar'がtrueに等しくない場合、あなたはあなたのコードをテストすることができません? – deKajoo

1

工場外ではアクセスできないテストはできません。

適切な方法は、それを公開することです。しかし、テスト可能にするためにすべてを公開するべきではないことに注意してください。実際には、その関数/変数のテストを追加することによって実際にアプリケーションに価値が追加されるかどうかを検討する必要があります。

+0

それが意味をなさないのであれば私は同意します、おそらくその必要はありません。 – patz

+0

それは精神です! (Y) –

関連する問題