簡體   English   中英

使用業力注入$ stateParams進行角度單元測試測試

[英]Injecting $stateParams for angular unit testing testing with karma

讓我們從控制器代碼開始:

angular
.module('hc.hotelContent')
.controller('NameLocationController', nameLocationCtrlFn); //Todo change hotelDataService
nameLocationCtrlFn.$inject = ['$stateParams', 'hotelDataService'];

  function nameLocationCtrlFn($stateParams, hotelDataService) {
       var vm = this,
       hotelId = $stateParams.hotelId;
       vm.Keys = {
        Name: 'Name',
        Street: 'Street',
        City: 'City',
        State: 'State',
        Zip: 'Zip',
        Country: 'Country'
    }
}

我確實有更多的代碼,但它的相關邏輯,我沒有將$ stateParmas注入控制器時我的測試工作正常。
所以繼承測試文件:

    describe('nameLocation component Controller', function () {
    var $controller,
            hotelDataServiceMock,
           stateParams,
            hotelId = "4611";
Keys = {
        Name: 'Name',
        Street: 'Street',
        City: 'City',
        State: 'State',
        Zip: 'Zip',
        Country: 'Country'
    }//@
    beforeEach(module('hc.hotelContent'));
        beforeEach(module('hc.app.core'));
        beforeEach(inject(injectFn));
       function injectFn(_$controller_, $stateParams, _hotelDataService_) {
            $controller = _$controller_;
            stateParams = $stateParams;

            hotelDataServiceMock = _hotelDataService_;
        } //controller injection fn

        function initCtrl() {
            controller = $controller('NameLocationController', {
                $stateParams: stateParams,
                hotelDataService: hotelDataServiceMock
            });
        }
describe('inserting a new hotel', function () {
        it('should populate Keys object', function () {
            var controller = initCtrl();
            expect(controller.Keys).toEqual(Keys);
        });
   }
}

即時收到未知提供程序錯誤。 我的控制器沒有任何東西,所有我在控制器中做的是將變量設置為$ stateParams變量。 我如何使用這種注射? 我的karma.conf文件被配置為以這個特定的順序加載jquery,angular,ui-router,mocks以及之后的所有js和html

編輯:我之前看過這篇文章 ,但我在我的主app模塊中使用ui-router,所以我添加了beforeEach(module('hc.app')); 代碼但仍然沒有

有一個類似的問題在一個指令中測試$ stateParams:

嘗試注入$state

然后你可以使用: $state.go('namedurl', {your_params_here}) $rootScope.$digest()或$ apply在你的控制器中

這將更新$stateParams 如果你嘗試將$stateParams注入一個提供者的模擬,他們只會被$ state服務覆蓋。

問題是在injectFn您的參數名稱$stateParams與您引用的變量( _$stateParams_ )不匹配? _$stateParams_injectFn未定義。

如果這不起作用,你是否也將ui-router注入模塊中,並且在測試中加載了該模塊? 這個問題也有類似的問題。

如果你想測試控制器使用$stateParams.hotelId ,你也可以用這樣的東西模擬$stateParams

function injectFn(_$controller_, _hotelDataService_, $provide) {
    $controller = _$controller_;
    hotelDataServiceMock = _hotelDataService_;
    $provide.value('$stateParams', {
        hotelId: 'someId',
    });
}

function initCtrl() {
    return $controller('NameLocationController', {
         hotelDataService: hotelDataServiceMock,
    });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM