无需模拟即可测试$ resource

时间:2016-03-30 21:15:55

标签: angularjs asynchronous typescript jasmine angular-resource

我试图通过Angular测试异步$资源服务。首先请注意,我不想模拟$ resource,我实际上想要获得结果并测试它们。

所以基本上我的getCountries方法只使用Angular的$ resource来返回一组国家。

方式

getCountries(): any {
        var countries = this.$resource(
            this.apiEndpoint.baseUrl,
            {
                'get': {
                    method: 'GET', isArray: false
                }
            });
        return countries;
}

在我的规范中,我无法在哪里运行Jasmine的done()方法。请阅读代码中的注释。

规格

describe(module', (): void => {
    var one;
    var SelfRegistrationResourceBuilder;

    beforeEach((): void => {
        angular.mock.module(
            'BuilderModule',
            'ngResource'
        );

        inject(
            ['Builder', (_SelfRegistrationResourceBuilder _: ISelfRegistrationResourceBuilder ): void => {
                SelfRegistrationResourceBuilder = _SelfRegistrationResourceBuilder_;
            }]);
    });


    describe('getCountries', (): void => {

        beforeEach((done) => { //done is a parameter in beforeEach
            SelfRegistrationResourceBuilder.getCountries().get(
                (value: any) => {
                    console.log("no error");
                    one = "aValue";
                    done();  //Do I have to call done() here
                }, (error: any) => {
                    console.log("error");
                    one = "aValue";
                    //done();  What about here
                })
            //done();  ..or here
        });

        it("should...", (done) => {
            expect(one).toBe("aValue");
            //done();  and here?
        });
    });
});

所以我的问题似乎是当我运行我的代码时,我或者得到了这个问题的标题中所述的错误,或者如果我使用哪个done()方法我调用那么我的变量名为"一个&# 34;是未定义的,因此暗示成功和错误回调永远不会被调用。我还可以证明成功和错误回调永远不会被调用,因为他们的console.log()不会打印到控制台。

最后,当我在浏览器中查看开发者工具的网络部分时,我看不到对服务器的任何请求。有人可以尝试帮助我,我想除了调用done()之外,我已经弄明白了。

由于

1 个答案:

答案 0 :(得分:0)

done用于异步测试。如果您测试不是异步,请不要使用done例如:

    // No done needed
    it("should...", () => {
        expect(one).toBe("aValue");
    });

对于异步测试,在异步操作完成后将其命名为 。所以:

    beforeEach((done) => { //done is a parameter in beforeEach
        SelfRegistrationResourceBuilder.getCountries().get(
            (value: any) => {
                console.log("no error");
                one = "aValue";
                done();  //  Yes call done
            }, (error: any) => {
                console.log("error");
                one = "aValue";
                // do not call done. You most likely want to throw to show this is an error case. 
            })
    });