AngularJS + Jasmine: Comparer des objets

Je viens juste de commencer à écrire des tests pour mon application AngularJS et fais en de Jasmin.

Voici les extraits de code

ClientController:

'use strict';

adminConsoleApp.controller('ClientController',
    function ClientController($scope, Client) {

        //Get list of clients
        $scope.clients = Client.query(function () {
            //preselect first client in array
            $scope.selected.client = $scope.clients[0];
        });

        //necessary for data-binding so that it is accessible in child scopes.
        $scope.selected = {};

        //Current page
        $scope.currentPage = 'start.html';

        //For Client nav bar
        $scope.clientNavItems = [
            {destination: 'features.html', title: 'Features'},
        ];

        //Set current page
        $scope.setCurrent = function (title, destination) {
            if (destination !== '') {
                $scope.currentPage = destination;
            }

        };

        //Return path to current page
        $scope.getCurrent = function () {
            return 'partials/clients/' + $scope.currentPage;
        };

        //For nav bar highlighting of active page
        $scope.isActive = function (destination) {
            return $scope.currentPage === destination ? true : false;
        };

        //Reset current page on client change
        $scope.clientChange = function () {
            $scope.currentPage = 'start.html';
        };
    });

ClientControllerSpec:

'use strict';

var RESPONSE = [
    {
        "id": 10,
        "name": "Client Plus",
        "ref": "client-plus"
    },
    {
        "id": 13,
        "name": "Client Minus",
        "ref": "client-minus"
    },
    {
        "id": 23805,
        "name": "Shaun QA",
        "ref": "saqa"
    }
];

describe('ClientController', function() {

    var scope;

    beforeEach(inject(function($controller, $httpBackend, $rootScope) {
        scope = $rootScope;
        $httpBackend.whenGET('http://localhost:3001/clients').respond(RESPONSE);
        $controller('ClientController', {$scope: scope});
        $httpBackend.flush();
    }));

    it('should preselect first client in array', function() {
        //this fails.
        expect(scope.selected.client).toEqual(RESPONSE[0]);
    });

    it('should set current page to start.html', function() {
        expect(scope.currentPage).toEqual('start.html');
    });
});

Le test échoue:

Chrome 25.0 (Mac) ClientController should preselect first client in array FAILED
    Expected { id : 10, name : 'Client Plus', ref : 'client-plus' } to equal { id : 10, name : 'Client Plus', ref : 'client-plus' }.
    Error: Expected { id : 10, name : 'Client Plus', ref : 'client-plus' } to equal { id : 10, name : 'Client Plus', ref : 'client-plus' }.
        at null.<anonymous> (/Users/shaun/sandbox/zong-admin-console-app/test/unit/controllers/ClientControllerSpec.js:43:39) 

Quelqu'un a une idée sur le pourquoi de ce qui se passe?

Aussi .. comme je suis nouveau à l'écriture d'AngularJS tests, les commentaires de savoir si je suis la mise en place de mon test de mal ou si elle peut être améliorée sera la bienvenue.

Mise à jour:

Y Compris ClientService:

'use strict';

AdminConsoleApp.services.factory('Client', function ($resource) {
    //API is set up such that if clientId is passed in, will retrieve client by clientId, else retrieve all.
    return $resource('http://localhost:port/clients/:clientId', {port: ':3001', clientId: '@clientId'}, {

    });
});

Aussi, j'ai reçu de contourner le problème en comparant les id à la place:

it('should preselect first client in array', function () {
    expect(scope.selected.client.id).toEqual(RESPONSE[0].id);
});
  • Il est possible de jasmin est la vérification de la non-propres propriétés. Ils ne s'affichent pas dans le JSON.stringify-ed version, mais ils vont être pris en compte pour la comparaison
  • Probablement non, mais juste pour être sûr, assurez-vous de vous échapper de votre numéro de port; étranger, les choses ont passé... $httpBackend.whenGET('http://localhost\\:3001/clients').respond(RESPONSE); j'ai eu un SOUFFLE pour une heure à essayer de déchiffrer une erreur qui a fini par être l'un sans échappement numéro de port, FWIW.
  • merci pour l'astuce, mais quand j'ai essayé de s'échapper le numéro de port, comme la façon dont vous l'avez fait, j'obtiens une exception: Erreur: Inattendu de la demande: OBTENIR localhost:3001/clients Pas plus de demande prévu
  • pouvez-vous nous en dire un peu plus? j'ai eu de contourner le problème en comparant le champ 'id' au lieu de la totalité de l'objet, mais je suis toujours curieux de savoir pourquoi l'objet de la comparaison échoué. une possibilité est que la portée.sélectionné.client contient en fait un $objet de la ressource..
  • C'est ce qui explique un peu plus je pense : stackoverflow.com/questions/8779249/...
InformationsquelleAutor shaunlim | 2013-03-18