Test w tym kodzie nie udaje się. Nie mogę wydawać się skutecznie przetestować zwrotu funkcji asynchronicznej.

describe('mocking services', function () {

    var someService, deferred;

    beforeEach(function () {

        module(function($provide){
            $provide.factory('someService', function($q){
                return{
                    trySynch: function(){
                        return 33;
                    },
                    tryAsynch: function(){
                        deferred = $q.defer();
                        return deferred.promise;
                    }
                };
            });
        });

        inject(function (_someService_) {
            someService = _someService_;
        });
    });

    it('should be able to test values from both functions', function () {
        expect(someService.trySynch()).toEqual(33);

        var retVal;
        someService.tryAsynch().then(function(r){
            retVal = r;
        });
        deferred.resolve(44);
        expect(retVal).toEqual(44);
    });

});

Po uruchomieniu pojawia się następujący błąd:

Chrome 36.0.1985 (Mac OS X 10.9.4) mocking services should be able to test values from both functions FAILED
        Expected undefined to equal 44.
        Error: Expected undefined to equal 44.
            at null.<anonymous> (/Users/selah/WebstormProjects/macrosim-angular/test/spec/services/usersAndRoles-service-test.js:34:24)

Jak mogę wykonać ten test?

3
Selah 13 sierpień 2014, 01:13

2 odpowiedzi

$q Odroczony jest nadal rozwiązywanie asynchronicznie.

Szybki test, choć w starszej wersji kątowej: http://plnkr.co/edit/yg2coxg0twbynixowjyb

Ten test powinien działać:

it('should be able to test values from both functions', function (done) {

    expect(someService.trySynch()).toEqual(33);

    someService.tryAsynch().then(function(r){
        expect(r).toEqual(44);
        done();
    });

    deferred.resolve(44);
});
0
George Pantazis 13 sierpień 2014, 06:32

Jeśli uruchomię rootScope.$apply() przed klauzulą oczekującą, że testuje moją funkcję asynchroniczną, test się powiedzie. Ponadto nie powiedzie się, jeśli dostanę nieprawidłową wartość, jak się spodziewałam.

Więc mój test jest funkcjonalny, ale jednak nie rozumiem, dlaczego Rootscope

Mój kod testowy wygląda tak:

describe('mocking services', function () {

    var someService, deferred, rootScope;

    beforeEach(function () {

        module(function($provide){
            $provide.factory('someService', function($q){
                return{
                    trySynch: function(){
                        return 33;
                    },
                    tryAsynch: function(){
                        deferred = $q.defer();
                        return deferred.promise;
                    }
                };
            });
        });

        inject(function ($injector) {
            someService = $injector.get('someService');
            rootScope = $injector.get('$rootScope');
        });
    });

    it('should be able to test values from both functions', function () {
        expect(someService.trySynch()).toEqual(33);

        var retVal;
        someService.tryAsynch().then(function(r){
            retVal = r;
        });
        deferred.resolve(44);
        rootScope.$apply();
        expect(retVal).toEqual(44);
    });

});
0
Selah 13 sierpień 2014, 15:09