2013-06-27 76 views
3

我已經得到了我想要寫一個簡單的單元測試套件的基本模型單元測試,而且我清楚地失去了一些東西......如何編寫AngularJS模型

該模型的代碼看起來是這樣的:

angular.module('AboutModel', []) 
    .factory(
     'AboutModel', 
     [ 
      function() { 
       var paragraphs = []; 
       var AboutModel = { 
        setParagraphs: function (newParagraphs) { 
         paragraphs = newParagraphs; 
        }, 
        getParagraphs: function() { 
         return paragraphs; 
        } 
       }; 

       return AboutModel; 
      } 
     ] 
    ); 

要求很簡單:提供一個getter和名爲paragraphs私人陣列setter方法。

這裏是據我已經與測試套件的代碼有:

describe('Testing AboutModel:', function() { 
    describe('paragraphs setter', function() { 
     beforeEach(module('AboutModel')); 
     it('sets correct value', inject(function (model) { 
      // STUCK HERE 
      // don't know how to access the model, or the setParagraphs() method 
     })); 
    }); 
    describe('paragraphs getter', function() { 
     // not implemented yet 
    }); 
}); 

我已經做了相當多的谷歌研發的網絡上,但至今沒有喜悅。

解決方案必須簡單;請幫忙!

它甚至可能是一個更好的方式來實現模型...開放的建議,使其更好。

任何有興趣,完整的源代碼是在這裏: https://github.com/mcalthrop/profiles/tree/imp/angular

在此先感謝

馬特

回答

4

您需要在您的測試運行beforeEach注入模型實例,然後分配它變成了一個變量,然後你可以重新使用你的測試。

var AboutModel; 

beforeEach(inject(function (_AboutModel_) { 
    AboutModel = _AboutModel_; 
})); 

然後,您可以訪問您的getter像這樣:

AboutModel.getParagraphs(); 

我已經優化了你的原始模型略,因爲我覺得它讀好一點(我的偏好):

'use strict'; 

angular.module('anExampleApp') 
    .factory('AboutModel', function() { 
    var _paragraphs; 

    // Public API here 
    return { 
     setParagraphs: function (newParagraphs) { 
     _paragraphs = newParagraphs; 
     }, 
     getParagraphs: function() { 
     return _paragraphs; 
     } 
    }; 
    }); 

然後進行測試,我會使用標準茉莉花測試和spies的組合:

'use strict'; 

describe('Service: AboutModel', function() { 

    beforeEach(module('anExampleApp')); 

    var AboutModel, paragraphs = ['foo', 'bar']; 

    beforeEach(inject(function (_AboutModel_) { 
    AboutModel = _AboutModel_; 
    })); 

    it('should set new paragraphs array', function() { 
    AboutModel.setParagraphs([]); 
    expect(AboutModel.getParagraphs()).toBeDefined(); 
    }); 

    it('should call setter for paragraphs', function() { 
    spyOn(AboutModel, 'setParagraphs'); 
    AboutModel.setParagraphs(paragraphs); 
    expect(AboutModel.setParagraphs).toHaveBeenCalledWith(paragraphs); 
    }); 

    it('should get 2 new paragraphs', function() { 
    AboutModel.setParagraphs(['foo', 'bar']); 
    expect(AboutModel.getParagraphs().length).toEqual(2); 
    }); 

}); 
+0

優秀!謝謝西蒙。 雖然有一個問題:是不是第二個測試是多餘的? ie,是不是你只是直接測試你剛剛做了什麼? –

+0

我想認爲它在測試中更加徹底:)第一個測試確保設置段落符合我們的期望,即將其分配給模型段落變量。第二個測試確保它將段落設置爲我們通過它的確切值。有些人可能會在一種測試方法中使用多個期望來做到這一點,我傾向於按照測試方法運行一種期望。 – newtriks

+0

很酷。完全同意「每個測試的一個斷言」方法。 –