0

我正在尝试对我创建的辅助函数执行一个简单的测试:

    function getPostId() {
        return $stateParams._id;
    }

这是我正在使用的测试,请注意 getService 只是 Angularinject()函数的包装器:

describe('wpApp Router', function() {

    var $state, $stateParams, Router;

    beforeEach(module('wpApp.core.router'));
    beforeEach(function() {
        $state = getService('$state');
        $scope = getService('$rootScope');
        $stateParams = getService('$stateParams');
        Router = getService('Router');
        $templateCache = getService('$templateCache');

        $templateCache.put('/app/sections/posts/list/post-list.html', '');
    });

    it('should provide the current post ID', function() {
        $state.go('posts.details', { _id: 1 });
        $scope.$digest();
        expect(Router.getPostId()).to.equal(1);
    });
});

我的路由器是这样的:

    $stateProvider
        .state('posts', {
            url: '/posts',
            controller: 'PostsListController as postsList',
            templateUrl: '/app/sections/posts/list/post-list.html'
        })

        .state('posts.details', {
            url: '/:_id',
            controller: 'PostDetailsController as postDetails',
            templateUrl: '/app/sections/posts/details/post-details.html'
        })

我正在尝试将当前状态设置posts.details_id1。然后测试我的辅助函数以查看它是否正确检索 ID。

但是,我在状态模板中遇到错误,如下所示:Unexpected request: GET /app/sections/posts/details/post-details.html

该状态posts.details是一个孩子,posts并且都有自己的模板,问题是我无法将两者都加载到templateCache或者至少我无法弄清楚如何这样做。

是否可以加载两个模板以完成测试?

4

1 回答 1

1

针对您的实际问题,缓存模板的最简单方法是使用类似karma-ng-html2js-preprocessor 的东西。它将缓存您的所有应用程序模板,并将它们作为模块提供给您的测试。

但是,从我可以从提供的代码中推测,这是不必要的。目前,您的单元测试实际上是一个集成测试,因为它依赖于'posts.details'状态的路由才能通过,而方法本身只关心$stateParams对象。

因此,$stateParams实际上只是一个普通的对象,一个更简单(更好)的方法只是在测试之前模拟它:

beforeEach(module(function($provide) {
  $provide.value('$stateParams', {
    _id: 1
  });
}));

然后您可以独立于您的状态测试您的服务方法:

it('should provide the current post ID', function() {
   expect(Router.getPostId()).toEqual(1);
);
于 2014-08-19T02:10:32.783 回答