1

一段时间以来,我一直在使用 AngularJS 和 Karma/Jasmine 进行单元测试(几个月,我认为这让我几乎是个老手了)。我一直想要一种在我的 Karma 测试中创建可重用函数的方法,但我已经让自己辞职,因为没有好的方法可以做到这一点。

我最近也开始使用量角器,它提供端到端测试。在量角器中,有一种要求语法可以将一个文件包含到另一个文件中,从而允许我们创建库函数。这非常方便,我想在 Karma/Jasmine 中使用类似的东西。

我还没有在量角器中找到这种能力存在的地方,但它显然在 Karma 中不存在。有没有人发现或实现了类似的功能?

4

1 回答 1

1

对,按照 jl 的建议,我最终得到了这段代码,效果很好。显然,我的 javascript 知识是一个缺陷,我并没有真正考虑到这一切都存在于全球地址空间中的事实。

首先,我创建一个文件“base_controller.spec.js”。在这个文件中,我声明了一个全局对象:

var BaseController = 
  {
    baseBeforeEach: function() {
      // mock Application to allow us to inject our own dependencies
      beforeEach(angular.mock.module('bProject'));

      // create the custom mocks on the root scope
      beforeEach(angular.mock.inject(function($rootScope, _$httpBackend_, SidebarService, $state, BreadcrumbService ){
        //create an empty scope
        scope = $rootScope.$new();
        scope.$rootScope = $rootScope;
        scope.$state = $state;
        scope.breadcrumb = BreadcrumbService;

        // we're just declaring the httpBackend here, we're not setting up expectations or when's - they change on each test
        scope.httpBackend = _$httpBackend_;

        // setup the project id to a known value
        scope.setupSidebar = SidebarService.sidebar;
        scope.setupSidebar.projectId = 2;

      }));
    },

    baseAfterEach: function() { 
      afterEach(function() {
        scope.$digest();
        scope.httpBackend.verifyNoOutstandingExpectation();
        scope.httpBackend.verifyNoOutstandingRequest();
      });    
    }
  };

然后,我只在测试中使用 BaseController:

describe( 'Risk functionality.', function() {
  BaseController.baseBeforeEach();
  BaseController.baseAfterEach();

  describe( 'Risks list controller.', function() {  

这个例子相当简单,尽管在每个控制器上都有模拟标准很好。但是我对每个控制器都有一套标准测试,这种方法可以让我做到。

需要注意的是 karma 配置中包含的顺序 - 您需要尽早包含此文件,否则某些模块无法看到它。

我会给 jl 一个赞成票,但这是一个评论,所以我不能!

于 2013-12-04T06:34:40.413 回答