Pregunta

Estoy tratando de escribir una unidad de prueba para ver si el 'getStudents()' proveedor de función en mi controlador se llama si algunas propiedades están definidos correctamente.Aviso el .el éxito (de) de devolución de llamada:

 $scope.update = function update() {
    // omitted, just doing some checking...
    // finally 
    else if (key.length === 3 || $scope.students.length === 0) {
       StudentsProvider.getStudents($scope.keyword, $scope.selectedFilters).success(function(data) {
           $scope.students = data;
       });
    }
 };

Mi karma de la prueba de unidad se parece a esto:

describe("Students: Controllers", function () {
    var $scope;
    var ctrl;
    beforeEach(module('studentsApp'));

    describe("SearchCtrl", function () {
        // Mock the provider
        var mockStudentsProvider = {
            getStudents: function getStudents() {
                return [
                    {
                         Education: [], 
                         Person: [{ 
                             ID: 1, 
                             Name: "Testing McTestsson", 
                             SSN: "1234567890",
                             Address: "Fakestreet 3", MobilePhone: "7777777"
                         }]
                    }
                ];
             }
         };
         var StudentsProvider;
         beforeEach(inject(function ($controller, $rootScope) {
             $scope = $rootScope.$new();
             ctrl = $controller('SearchCtrl', { $scope: $scope, StudentsProvider: mockStudentsProvider});
             StudentsProvider = mockStudentsProvider;
         }));
         describe("Update", function () {
             beforeEach(function () {
                 spyOn(StudentsProvider, 'getStudents');
             });
             it("should always call the provider with 3 letters", function () {
                 $scope.keyword = "axe";
                 $scope.update();
                 expect(StudentsProvider.getStudents).toHaveBeenCalled();
                 expect(StudentsProvider.getStudents).toHaveBeenCalledWith("axe", "");
             });
         });
    });
});

Cuando me encuentro con esto, me sale el siguiente error:

TypeError: 'undefined' is not an object (evaluating 'StudentsProvider.getStudents($scope.keyword, $scope.selectedFilters).success')

y es probablemente porque no estoy burlando de el .el éxito (de) de devolución de llamada.Cómo iba yo a hacer eso?Gracias de antemano!

¿Fue útil?

Solución

Reemplazar esta:

var mockStudentsProvider = {

    getStudents: function getStudents() {
        return [{
            Education: [],
            Person: [{
                ID: 1,
                Name: "Testing McTestsson",
                SSN: "1234567890",
                Address: "Fakestreet 3",
                MobilePhone: "7777777"
            }]
        }];
    }
};

con esto:

var mockStudentsProvider = {
    getStudents: function getStudents() {
        var retVal = [{
            Education: [],
            Person: [{
                ID: 1,
                Name: "Testing McTestsson",
                SSN: "1234567890",
                Address: "Fakestreet 3",
                MobilePhone: "7777777"
            }]
        }];
        return {
            success: function(fn) {
                fn(retVal)
            };

        }
    }
};

Y reemplazar este:

spyOn(StudentsProvider, 'getStudents');

con esto:

spyOn(StudentsProvider, 'getStudents').andCallThrough();
  1. Cuando no se utiliza andCallThrough() o andCallFake() jazmín impide la ejecución del método y devuelve null.En el interior de su método de actualización que está llamando null.success.Esto se producirá.(http://jasmine.github.io/1.3/introduction.html)

  2. En su método ficticio usted necesita para cambiar el retorno formato--el verdadero método http que devuelve un objeto donde el éxito se refiere a una función que toma una entrada de una función de devolución de llamada.

En su caso, la función de devolución de llamada es:

function(data) {
   $scope.students = data;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top