2016-09-09 72 views
1

如何在角度js文件中編寫變量的單元測試。javascript單元測試變量和代碼沒有封裝在函數內

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

我怎麼之前賦值的testvar如果語句運行

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

我應該封裝整個如果在一個功能,並使之通過的回報。

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

有沒有更好的方法來做到這一點。 或者js文件應該首先有setter和getters。謝謝

+0

這取決於你在裏面有什麼'if(testVar){' – jcubic

+0

@jcubic sry for confusion,我實際上希望能夠傳遞一個值給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 
    }); 
}); 

但是,如果你需要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

謝謝,如果我關心我從sometherfunc得到的值,這將是有意義的,但如果我不,並且只是想將'testVar'的值設置爲某個隨機值。 您是否認爲在這種情況下我需要有setter並在afterEach中調用它? – patz

+0

謝謝我會試試 – patz

+0

我不明白,如果'testVar'不等於true,那麼你不能在你的代碼裏面測試你的代碼嗎? – deKajoo

1

你不能測試在你的工廠以外不能訪問的函數/變量。

這樣做的正確方法是將其公開。但要注意,你不應該暴露一切,只是爲了使其可測試。你應該真的考慮爲這個函數/變量添加一個測試是否會爲你的應用增加值。

+0

我同意,如果它沒有意義,那麼可能不需要它。 – patz

+0

這就是精神! (Y) –