用于茉莉/业力测试的angularjs中的全局模拟对象

Des*_*xia 10 javascript unit-testing jasmine angularjs karma-runner

我有一个对象,我正在嘲笑单元测试.基本上在我的测试文件中,我将其模拟如下:

var mockObject = {
    mockMethod1 : function() {return true},
    mockMethod2 : function() {return true}
};


beforeEach(module('myModule') , function ($provide) {
    $provide.value('realObject',mockObject);
});
Run Code Online (Sandbox Code Playgroud)

我理解它的方式是,当我在我的模块中测试功能等...引用"realObject"的任何地方都将使用我的"mockObject"

我的问题是我已经制作了多个js文件进行测试,我不想在每一个中定义我的"mockObject"...我也不想在比我更多的地方维护它.

有没有办法将我的"mockObjact"移动到一个单独的文件中,该文件包含在karma.conf.js中,这将使"mockObject"可用于注入我的任何测试文件.....我想的是你如何注入$ rootScope

Eit*_*eer 5

如果它是在特定套件的上下文之外编写但仍由Jasmine执行,则可以创建全局beforeEach函数,例如,创建一个自定义文件以由Karma加载并在那里编写您的beforeEach函数,而不将其封闭在describe函数中.

例:

var myGlobal;

beforeEach(function() {
    // This will run before any it function.
    // Resetting a global state so the change in this function is testable
   myGlobal = 10
});

describe('first suite', function(){
  it('is a test', function(){
      expect(myGlobal).toBe(10);
      // Set the value to show that beforeEach is executed for each it function
      myGlobal = 20;
      expect(myGlobal).toBe(20);
  });

  it('is another test', function(){
      expect(myGlobal).toBe(10);
      myGlobal = 30;
      expect(myGlobal).toBe(30);
  });
});

describe('second suite', function(){
  it('is a test', function(){
      expect(myGlobal).toBe(10);
  });
});
Run Code Online (Sandbox Code Playgroud)

请看这里的小提琴


aet*_*aet 3

您可以构建一个包含模拟的服务,并将该服务注入每个测试文件中。

beforeEach(inject(function($rootScope, $controller, yourMockSvc) {
    appScope = $rootScope.$new();
    appCtrl = $controller('AppController', {
        $scope: appScope,
        yourSvc: yourMockSvc
    });
}));
Run Code Online (Sandbox Code Playgroud)