Karma pruebas con .el éxito (de) llegar 'undefined' no es un objeto'
-
21-12-2019 - |
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!
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();
Cuando no se utiliza
andCallThrough()
oandCallFake()
jazmín impide la ejecución del método y devuelve null.En el interior de su método de actualización que está llamandonull.success
.Esto se producirá.(http://jasmine.github.io/1.3/introduction.html)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;
}