模拟服务返回Object($$状态)错误

Pri*_*ign 8 javascript angularjs bardjs

我一直在跟随John Papa和Ward Bell对PluralSight进行角度测试.

当我运行我的规格时,我目前收到以下错误.

AssertionError: expected { Object ($$state) } to have a property 'length'
at Assertion.assertLength (bower_components/chai/chai.js:1331:37)
at Assertion.assert (bower_components/chai/chai.js:4121:49)
at Context.<anonymous> (scripts/home/homeController.Specs.js:48:49)
Run Code Online (Sandbox Code Playgroud)

请注意,我只包含了我认为相关的代码,因此我没有用无关的信息重载这个问题.如果您需要查看更多代码,这不是问题.

我的代码如下:

homeController.js:

window.app.controller('homeController', ['$scope', 'sidebarService',
             function ($scope, sidebarService) {

    $scope.title = 'Slapdash';
    $scope.sidebar = {
        "items": sidebarService.getSidebarItems()
    };

}])
Run Code Online (Sandbox Code Playgroud)

sidebarService.js:

(function () {
window.app

    .service('sidebarService',['$http', function ($http) {

    this.getSidebarItems = function () {
        $http.get("http://wwww.something.com/getSidebarItems")
            .then(function (response) {
                return response.data;
            });
       };
   }]);
}());
Run Code Online (Sandbox Code Playgroud)

homeController.Specs.js:

beforeEach:

beforeEach(function () {

    bard.appModule('slapdash');

    bard.inject(this, '$controller', '$q', '$rootScope')

    var mockSidebarService = {
        getSidebarItems : function(){
            return $q.when(mockSidebarMenuItems);
        }
    };

    controller = $controller('homeController', {
        $scope: scope,
        sidebarService: mockSidebarService
    });

});
Run Code Online (Sandbox Code Playgroud)

失败的规格:

        it('Should have items', function () {
        $rootScope.$apply();

        expect(scope.sidebar.items).to.have.length(mockSidebarMenuItems.length); // same number as mocked
        expect(sidebarService.getSidebarItems).to.have.been.calledOnce; // it's a spy

    });
Run Code Online (Sandbox Code Playgroud)

Pri*_*ign 3

答案是我返回的是服务的结果而不是承诺。

    $http.get("http://wwww.something.com/getSidebarItems")
        .then(function (response) {
            return response.data; // <- returning data not promise
        });
Run Code Online (Sandbox Code Playgroud)

当我嘲笑时我正在使用

var mockSidebarService = {
    getSidebarItems : function(){
        return $q.when(mockSidebarMenuItems);
    }
};
Run Code Online (Sandbox Code Playgroud)

这嘲笑了一个承诺。然而,我只需要返回数据,因为服务中正在等待承诺。

       mockSidebarService = {
           getMenuItems : function(){
               return mockSidebarMenuItems
           }
       };
Run Code Online (Sandbox Code Playgroud)

我进行了更改,现在一切正常。花了一段时间,但至少它是有道理的。