【问题标题】:what and how to do unit test for angular factories什么以及如何对角度工厂进行单元测试
【发布时间】:2016-05-15 18:08:24
【问题描述】:

Angular 工厂很棒!!写单元测试的时候,有点迷惑,到底要不要写单元测试。

我有以下工厂:

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

我正在使用 jasmine、angular-mock、karma。

【问题讨论】:

    标签: angularjs unit-testing jasmine karma-jasmine


    【解决方案1】:

    与一般的所有单元测试一样,您正在通过测试仔细检查代码的行为。因此,如果您在致电 doSomething() 后预计会发生某些事情,您应该进行测试以反映这种预期。

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

    这是我们为简单的常规设置和测试行为构建了测试的工厂样本的 sn-p。

        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 执行此操作,这里有大量文档和示例可以帮助您入门,就像这里 Jasmine Spies

    【讨论】:

    • 感谢您的解释。在我的示例中,我想知道如何设置 spy 以测试在测试 MyFirstFactory.doSomething 时是否调用了 MySecondFactory.doWork() 方法。
    猜你喜欢
    • 2011-06-23
    • 1970-01-01
    • 2011-10-18
    • 2019-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    • 1970-01-01
    相关资源
    最近更新 更多