【问题标题】:$state does not transition to defined state in unit test$state 不会在单元测试中转换到定义的状态
【发布时间】:2013-08-14 18:09:00
【问题描述】:

我有使用 $state 的服务。我正在尝试对服务进行单元测试。 我看到 $state.current 在调用 $state.transitionTo 后没有改变。 我检查了 $stateProvider,它包含状态。

路线配置:

angular.module('EmsWeb.Routes', ['ui.compat']).config(['$routeProvider', '$httpProvider', '$stateProvider', '$locationProvider',
    function($routeProvider, $httpProvider, $stateProvider, $locationProvider) {
var defaultView = {
            name: 'defaultView',
            url: '',
            template: '<div />'
        };

        var view = {
            name: 'mainView',
            url: '/view:nodeId:navParams:reqContext', //added reqContext in order to change state parameters that will trigger new navigation to view
            templateUrl: 'MainView.html',
            controller: 'MainAreaCtrl'
        };
$stateProvider.state(defaultView);
        $stateProvider.state(view);
        $locationProvider.html5Mode(true);
}]);

服务代码:

angular.module('EmsWeb.Services').factory('MetadataNavigation', ['$q', '$state', '$stateParams', 'DalService', 'ResponseUtil', function ($q, $state, $stateParams, dalService, responseUtil) {
    return {
         hasChangedBroadcastData: function (nodeId, navParams, appContext) {
            if (!$state.is('mainView'))
                return true;
            if ($stateParams.nodeId !=nodeId)
                return true;
            return false;                   
        }
}]);

我的测试:

    describe("Unit: MetadataNavigation->", function () {
        var service,stateProvider;  

        beforeEach(angular.mock.module('EmsWeb.Routes', function ($stateProvider) {
            stateProvider = $stateProvider;
        }));
        beforeEach(angular.mock.module('EmsWeb.Services')); 

        beforeEach(inject(function ($state, MetadataNavigation) {
            service = MetadataNavigation;
            $state.transitionTo('defaultView', {}, false);
//STATE WAS NOT CHANGED
        }));
    describe("hasChangedBroadcastdata:", function () {
            var navParams1, navParams2, nodeId1, nodeId2, appContext1, appContext2, state;  
            beforeEach(inject(function ( AppModel) {                
                appContext1 = AppModel.context;
            }));


            it('broadcastdata has not changed',inject(function ($state) {

                nodeId1 = 'nodeId1';
                nodeId2 = 'nodeId2';
                navParams1 = [{
                    targetName: 'fundId',
                    value: 'LPL.2q.xxxx',
                    display: 'ACLASS'
                }, {
                    targetName: 'fundId',
                    value: 'LPL.2q.yyyy',
                    display: 'BCLASS'
                }];
                navParams2 = [{
                    targetName: 'fundId',
                    value: 'LPL.2q.xxxx',
                    display: 'ACLASS'
                }, {
                    targetName: 'fundId',
                    value: 'LPL.2q.yyyy',
                    display: 'BCLASS'
                }];

                //quick way to copy w/o copying properties
                appContext2 = angular.fromJson(angular.toJson(appContext1));

                $state.transitionTo('mainView', { 'nodeId': nodeId1, 'navParams': navParams1, 'reqContext': appContext1.toRequestContext() }, false);
//STATE WAS NOT CHANGED
                expect(service.hasChangedBroadcastData(nodeId2, navParams2, appContext2)).to.be.false;                              
            }));

        });

    });

我查看了调试器并且 $state.current 保持不变,即 $state.current.name 为空且 $state.current.abstract 为 true 我尝试了不同的方法都无济于事。

我错过了什么?

谢谢。

【问题讨论】:

    标签: unit-testing angularjs automated-tests bdd angularjs-routing


    【解决方案1】:

    不确定 UI-Router 是否也是如此,但通常会缺少摘要循环,因此最简单的方法是尝试调用 $scope.$digest() 或 $scope.$apply()(您可以这样做在您的情况下在 $rootScope 上)...

    您可能必须模拟 $template factory 以避免 $http 后端会出错的服务器调用(我相信它是在 UI-Router 中调用的)...

    【讨论】:

    • 我去度假了,我会在清理完假期积压后立即尝试 :-)
    猜你喜欢
    • 1970-01-01
    • 2018-09-05
    • 1970-01-01
    • 2017-03-23
    • 1970-01-01
    • 2016-01-01
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    相关资源
    最近更新 更多