Karma test avec .success() se 'undefined' n'est pas un objet'
-
21-12-2019 - |
Question
Je suis en train d'écrire un test unitaire pour voir si le " getStudents()' fournisseur de fonction dans mon contrôleur est appelé si certaines propriétés sont configurés de façon appropriée.Avis de la .success() rappel:
$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;
});
}
};
Mon karma de l'unité de test ressemble à ceci:
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", "");
});
});
});
});
Lorsque je l'exécute, j'obtiens l'erreur suivante:
TypeError: 'undefined' is not an object (evaluating 'StudentsProvider.getStudents($scope.keyword, $scope.selectedFilters).success')
et c'est sans doute parce que je ne suis pas moqueur de l' .success() de rappel.Comment dois-je procéder?Merci à l'avance!
La solution
Remplacer ce:
var mockStudentsProvider = {
getStudents: function getStudents() {
return [{
Education: [],
Person: [{
ID: 1,
Name: "Testing McTestsson",
SSN: "1234567890",
Address: "Fakestreet 3",
MobilePhone: "7777777"
}]
}];
}
};
avec ceci:
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)
};
}
}
};
Et remplacer ce:
spyOn(StudentsProvider, 'getStudents');
avec ceci:
spyOn(StudentsProvider, 'getStudents').andCallThrough();
Lorsque vous n'utilisez pas
andCallThrough()
ouandCallFake()
jasmin empêche l'exécution de la méthode et retourne la valeur null.À l'intérieur de votre méthode de mise à jour que vous appeleznull.success
.Ce sera un échec.(http://jasmine.github.io/1.3/introduction.html)Dans votre maquette méthode, vous devez modifier le format de retour-la véritable méthode http renvoie un objet où la réussite se réfère à une fonction qui prend en entrée une fonction de rappel.
Dans votre cas, la fonction de rappel est:
function(data) {
$scope.students = data;
}