2016-05-02 17 views
0

Ich versuche, eine Methode in einem Dienst zu verspotten, die ein Versprechen zurückgibt. Die Steuerung:Controller nicht aufrufen, dann mit Schein-Service zurückgestellt

app.controller('MainCtrl', function($scope, foo) { 
var self = this; 
this.bar = ""; 

this.foobar = function() { 
    console.log('Calling the service.'); 
    foo.fn().then(function(data) { 
    console.log('Received data.'); 
    self.bar = data; 
    }); 
} 

this.foobar(); 
}); 

Die Spec-Datei:

angular.module('mock.foo', []).service('foo', function($q) { 
var self = this; 

this.fn = function() { 
    console.log('Fake service.') 
    var defer = $q.defer(); 
    defer.resolve('Foo'); 
    return defer.promise; 
}; 
}); 

describe('controller: MainCtrl', function() { 
var ctrl, foo, $scope; 

beforeEach(module('app')); 
// inject the mock service 
beforeEach(module('mock.foo')); 

beforeEach(inject(function($rootScope, $controller, _foo_) { 
    foo = _foo_; 
    $scope = $rootScope.$new(); 

    ctrl = $controller('MainCtrl', {$scope: $scope , foo: foo }); 
})); 

it('Should call foo fn', function() { 
expect($scope.bar).toBe('Foo'); 
}); 

}); 

Beim Debuggen, kann ich in der Steuerung sehen das Versprechen Objektzustand wird 1 (aufgelöst). Der Rückruf mit Erfolg innerhalb von then wird jedoch nie aufgerufen.

Der folgende Plunker http://plnkr.co/edit/xpiPKPdjhiaI8KEU1T5V reproduziert das Szenario. Jede Hilfe würde sehr geschätzt werden.

Antwort

1

Sie müssen einen Verweis auf $ rootScope in Ihrem Test erhalten und rufen:

$rootScope.$digest() 

Ihre zupfen, revisited:

$digest called and test passed.

Auch Ihre Mock Rückkehr nichts in der Entschlossenheit , Fügte ich hinzu:

defer.resolve ('Foo');

HTH