2016-05-09 10 views
8

Ho seguito il test angolare Play by Play su PluralSight di John Papa e Ward Bell.

Attualmente sto ottenendo il seguente errore quando eseguo le mie specifiche.

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) 

Si noti che ho incluso solo il codice che credo sia rilevante in modo che non sto sovraccaricando a questa domanda con informazioni irrilevanti. Se hai bisogno di vedere più codice non è un problema.

Il mio codice è il seguente:

homeController.js:

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

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

}]) 

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; 
      }); 
     }; 
    }]); 
}()); 

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 
    }); 

}); 

mancanza spec:

 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 

    }); 
+0

Avete controllato che 'return $ q.when (mockSidebarMenuItems);' restituendo effettivamente gli articoli? in particolare 'mockSidebarMenuItems'. –

+0

bene questo è il problema ma non la soluzione. Restituisce un oggetto (stato $$). Ne ho bisogno per restituire gli articoli –

+1

@ It-Z Ho trovato la risposta! Mi ci è voluto molto tempo per risolverlo, ma dopo essere tornato da una corsa e averlo guardato con occhi nuovi, tutto ha avuto un senso! –

risposta

3

La risposta era che stavo tornando a seguito del non il servizio una promessa.

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

Quando mi è stato beffardo che stavo usando

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

che prende in giro una promessa. Tuttavia, dovevo solo restituire i dati poiché la promessa era attesa nel servizio.

 mockSidebarService = { 
      getMenuItems : function(){ 
       return mockSidebarMenuItems 
      } 
     }; 

Ho apportato le modifiche e tutto funziona ora. Ci è voluto un po 'ma almeno ha un senso.

Problemi correlati