2016-02-05 87 views
1

角工廠是偉大的!在編寫單元測試的時候,我們應該寫單元測試還是不行,這有點令人困惑。什麼和如何做角工廠的單元測試

我有以下工廠:

(function(myApp) { 
myApp.factory('MyFirstFactory', function(MySecondFactory){ 
    function MyFirstFactory(config){ 
    this.value1 = 'value1'; 
    setDefault(this); 
    } 

    MyFirstFactory.doSomething = function(){ 
    var config = { 
     findWork: true; 
     myWork: MySecondFactory.doWork() 
    }; 
    return new MyFirstFactory(config); 
    }; 

    return MyFirstFactory; 
}); 
})(angular.module('MyModule')); 

因此,對於以上的工廠,我們需要編寫單元測試MyFirstFacotry和DoSomething的功能? 如果是,如何才能實現用茉莉和因果報應..嘗試以下操作:

describe('MyFirstFactory', function() { 
    var mockMyFirstFactory; 
    beforeEach(function(){ 
    module('MyModule'); 
    inject(function(MyFirstFactory){ 
     mockMyFirstFactory = MyFirstFactory; 
    }); 
    }); 

    it('MyFirstFactory should be defined', function(){ 
    expect(mockMyFirstFactory).toBeDefined(); 
    }); 
    it('should do something', function(){ 
    // how to test doSomething 
    }); 
}); 

我用的茉莉,角模擬,因果報應。

回答

2

與所有通用單元測試一樣,您正在通過測試來仔細檢查代碼的行爲。因此,如果您在撥打doSomething()之後有預期會發生某些事情,則應該進行測試以反映該期望。

it('should do something', function(){ 
    mockMyFirstFactory.doSomething(thing); 
    expect(mockMyFirstFactory.somethingBool).toBe(true); 
    expect(mockMyFirstFactory.somethingDone).toBe("some value"); 
    expect(mockMyFirstFactory.someMethod).toHaveBeenCalled(); 
    }); 

這裏是我們已經建立測試爲簡單的一般設置和測試的行爲我們的工廠的一個樣本的一個片段。

describe('imageUploader.imageModel module', function() { 
     // VARIABLES 
     var imageModel, imageModelFactory, $rootScope, sharedDataService; 
     // INJECT AND SETUP DEPENDENCIES 
     beforeEach(module('imageModel')); 

     beforeEach(inject(function (_$rootScope_, $injector, _imageModelFactory_) { 
      $rootScope = _$rootScope_; 
      sharedDataService = $injector.get('sharedDataService'); 
      imageModelFactory = _imageModelFactory_; 
      spyOn($rootScope, '$apply'); 
     })); 
     // SET UP MOCK DATA 
     beforeEach(function() { 
      sharedDataService.metadata = [{metadataItemOne: "one", metadataItemTwo: "two"}]; 
      var loadedData = { 
       name: 'test_name.jpg', 
       target: { 
        result: 'fakedata12345' 
       } 
      }; 
      var fake_file = { 
       data: "fakedata12345", 
       fileName: loadedData.name, 
       fileType: "image", 
       fileSize: 1024, 
       fileDate: "7-7-2015" 
      }; 
      imageModel = imageModelFactory(fake_file, loadedData); 
     }); 
     // TEST BEHAVIOR 
     it('can get an instance of imageModelFactory', function() { 
      expect(imageModelFactory).toBeDefined(); 
     }); 
     it('can instantiate an instance of imageModel', function() { 
      expect(imageModel).toBeDefined(); 
     }); 
     it('can set upload state', function() { 
      imageModel.setUploaded(true); 
      expect(imageModel.isUploaded).toBe(true); 
      expect(sharedDataService.imagesSucceeded).toBe(1); 
      imageModel.setUploaded(false); 
      expect(imageModel.isUploaded).toBe(false); 
      expect(sharedDataService.imagesSucceeded).toBe(0); 
      expect(imageModel.RelatedToUpload).toHaveBeenCalled() 
     }); 
    } 

如果所有都試圖找出是如何與茉莉花做到這一點,有大量的文檔和例子來讓自己開始,像解釋權這裏Jasmine Spies

+0

謝謝。在我的例子中,我想知道如何設置間諜來測試如果MySecondFactory.doWork()方法已被調用,同時測試MyFirstFactory.doSomething。 – Nish