使用jasmine返回promise的测试方法

时间:2015-06-11 11:59:17

标签: angularjs unit-testing jasmine karma-runner karma-jasmine

我正在使用茉莉花和业力测试我的角度应用程序。我的服务如下

app.service('demo1', function( $http ){
    this.send = function(){
        return $http({
            url: 'someurl'        
        });
    }
});

使用ngMockE2E嘲笑回复。

我的茉莉花规格如下:

describe('Testing asynchronus', function(){
    var demoService;
    beforeEach(function(){
        module('app');
        inject(function( demo1 ){
            demoService = demo1
        });
    });

    it('Should be able to test promise', function(){            
        demoService.send().then(function( data ){
            expect(data.status).toBe(true);
        });
    });    
});

现在的问题是,expect没有执行。无论data.status的值是多少,每次都会通过测试。我需要有关如何测试这些场景的帮助?提前谢谢。

真实代码:

describe("Testing MetaService", function(){

    var _entityMeta_, metaService, scope;

    beforeEach(function(){
        console.log( '---------------------- Starting Meta Service fetchEntityMeta Test ---------------------------' );
        module(APP_MODULE_NAME);

        inject(function(_entityMeta_, _metaService_, $rootScope){
            metaService = _metaService_;
            entityMeta = _entityMeta_;
            scope = $rootScope.$new();
        });
    });

    afterEach(function(){
        console.log( '---------------------- Ending Meta Service fetchEntityMeta Test ---------------------------' );
    });


    // Giving mock data from entityMeta.person as input
    it("Should have a valid structure", function($rootScope){ 

        console.log( '////////////////////////////////////////////' );
        metaService.fetchEntityMeta('person').then(function( data ){
            console.log( data );
            expect(data.type).toBe('object');
            expect(data.properties.length).toBeGreaterThan(0);
            expect(data.definitions.length).toBeGreaterThan(0);            
        });        

    });

});

我收到以下错误:

Error: Timeout - Async callback was not invoked within timeout specified
 by jasmine.DEFAULT_TIMEOUT_INTERVAL.

2 个答案:

答案 0 :(得分:1)

尝试添加

beforeEach(module('app'));

下的描述

答案 1 :(得分:0)

如果您正在使用Jasmine 2,则传递给it的回调参数应该是测试结束时调用的done函数。 (如果从未调用测试运行器将超时。)

(请参阅the official doc hereone of many blog posts。)

我真的不明白为什么在这种情况下传递$rootScope,但错误消息看起来像是抱怨,因为done函数(碰巧名为$rootScope这里没有被称为。

这可能有效:

// Giving mock data from entityMeta.person as input
it("Should have a valid structure", function(done){ 

    console.log( '////////////////////////////////////////////' );
    metaService.fetchEntityMeta('person').then(function( data ){
        console.log( data );
        expect(data.type).toBe('object');
        expect(data.properties.length).toBeGreaterThan(0);
        expect(data.definitions.length).toBeGreaterThan(0);            
        done();
    }, function (e) {
        // The promise was not resolved, this is most likely an
        // implementation error. Let's fail the test !
        throw new Error(e);
    });        

});

如果永远不会调用then部分,done功能也不会,您现在就会看到超时错误。