Wie zum Hohn eckig $resource Jasmin tests
Ich bin versuchen zu testen, ein controller, der verwendet eckig $resource.
function PermissionsCtrl($scope, $resource, $cookies) {
var Object = $resource('/v1/objects/:id');
loadObjects();
function loadObjects() {
$scope.myAppObjects = new Array();
var data = AppObject.get({find: '{"app_id": '+wtm.app_id+'}'},
function(){
if (data.results) {
for(var i = 0; i< data.results.length; i++) {
if(!data.results[i].is_deleted) {
(function(i){
$scope.objects(data.results[i]);
}(i));
}
}
}
},
function(error){console.log(error);});
}
Und hier ist der test-code.
var apiServer = "...";
var app_id = 999
var mock_object_data = {...};
describe('apps permissionsCtrl', function(){
var scope, ctrl, $httpBackend;
//Create a matcher for comparing data
beforeEach( function() {
this.addMatchers({
toEqualData: function(expected) {
return angular.equals(this.actual, expected);
}
});
});
//Create the controller with injected data/services
beforeEach(inject(function(_$httpBackend_, $rootScope, $controller, $resource) {
$httpBackend = _$httpBackend_;
//cookie data to inject
var cookies = new Array();
cookies['id'] = '...'; //just needs to be declared
$httpBackend.expectGET(apiServer+'/v1/app_objects? find=%7B%22app_id%22:'+app_id+'+%7D&access_token=' + cookies['id'])
.respond( mock_object_data );
var $injector = angular.injector(['ng', 'ngResource']);
var $resource = $injector.get('$resource');
scope = $rootScope.$new();
ctrl = $controller(PermissionsCtrl, {$scope: scope, $cookies: cookies, $resource: $resource});
}));
it('should put object data into $scope', function() {
$httpBackend.flush();
expect(scope.objects).toEqualData( mock_object_data );
});
});
Wenn ich diesen starte, bekomme ich
Error: Unknown provider: $resourceProvider <- $resource
in der Zeile, wo ich zu schaffen versuche meinen controller. Ich verstehe nicht, wie man injizieren diese in meinem controller und egal was ich versuche ich bekomme den gleichen Fehler. Ein paar Dinge, die ich versucht habe sind
- Die Deklarierung eines leeren mock-Objekt und übergeben Sie es durch, ähnlich wie meine cookies variable. Ich vermute, dies ist wahrscheinlich eine schlechte Lösung, da ich eigentlich den Dienst verwenden möchten.
- Nachahmung der Umfang mock und übergeben es in meinen inject-Funktion und übergeben $Ressourcen.$neues() zu meinem controller.
- Nichts tun und hoffen, dass httpBackend würde es abdecken, dass da ist, was letztlich aufgerufen wird, sowieso. Vojta Jína gemacht, es Klang wie das funktionieren würde, aber keine Würfel.
- Milde Epitheta. Befriedigend aber nicht sehr effektiv.
InformationsquelleAutor akronymn | 2013-01-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen zu instanziieren
$resource
mit dem folgenden code:Ähnlich wie für andere Dienstleistungen, es sei denn, Sie sind in anderen Modulen noch. Fügen Sie das Modul in das array.
Mehr info
Es stellt sich heraus, das problem mit dieser Lösung ist, dass die $resource ist nicht wirklich ein service. Es ist eine Fabrik. docs.angularjs.org/api/ngResource.$resource
InformationsquelleAutor asgoth
Nach mehr zu Lesen und mehr zu Experimentieren scheint es der richtige Weg dies zu tun ist, zu abstrahieren, verwenden Sie $resource aus dem controller. In meinem Fall schrieb ich eine Dienstleistung, die sich auf $resource und dann injizieren, der service in meinem controller. Inzwischen habe ich die test, service getrennt von meinem controller. Eine bessere Praxis um.
Mein service Erklärung:
und in meinem unit-tests, die ich führen Sie es durch in ein beforeEach-setup-Funktion
Also Sie enthalten
app.js
zu test-controller ?Aber nicht Sie bekommen das gleiche problem beim testen der service?
Können Sie mir helfen, mich auf diesen einen, es ist so ziemlich das gleiche... stackoverflow.com/questions/30947701/...
können Sie schreiben kompletten Beispielcode, wie mock $resource service?
InformationsquelleAutor akronymn