首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用$provide和$q对工厂进行单元测试

如何使用$provide和$q对工厂进行单元测试
EN

Stack Overflow用户
提问于 2018-04-13 23:39:47
回答 1查看 25关注 0票数 0

我正在尝试为一个依赖于返回promise的另一个工厂函数的服务编写单元测试。我遵循了在这个questionanswer中看到的过程,但是由于某些原因,我试图验证的then()中的代码没有被调用。我怎么才能让它工作呢?如果可能的话,我想使用不执行spyOn的版本(答案中的更新部分)。

代码语言:javascript
复制
var app = angular.module('test', []);

app.factory('managerService', (managerModel) => {
    var service = {
        getCurrentUser: getCurrentUser
    }

    function getCurrentUser() {
        return managerModel.api.get();
    }
    return service;
})

describe('promise with provider', () => {
    var managerModelMOCK = {
        api: {}
    };
    var $q;
    var $rootScope;
    var deferredUser;
    //   beforeEach(inject(()=> {})) //no inject here: Injector already created, can not register a module!

    beforeEach(angular.mock.module('test'));

    beforeEach(() => {
        angular.mock.module(function ($provide) {
            $provide.value('managerModel', managerModelMOCK); // override version here
        });
    });

    beforeEach(inject(($q) => {
        deferredUser = $q.defer();
        managerModelMOCK.api.get = () => {
            return deferredUser.promise;
        }
    }));


    it('should resolve a promise', angular.mock.inject((managerService, $rootScope) => {
        expect(managerService).toBeDefined();
        var expected = {
            Name: 'Somebody'
        };
        var actual;

        //this doesn't work either
        // var innerPromise = $q.defer();
        // innerPromise.resolve(expected);

        // managerModel.api.get = () => innerPromise.promise;

        deferredUser.resolve(expected);

        $rootScope.$apply();

        managerService.getCurrentUser()
            .then((user) => {
                actual = user;
            });

        //undefined, why?
        expect(actual).toBeDefined();
    }))
})
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-02 05:11:17

呃,我保证是新手犯的错误。promise链中的then()函数需要return,因此以下代码可以工作:

代码语言:javascript
复制
    managerService.getCurrentUser()
        .then((user) => {
            actual = user;
            //promise chains have to return
            return;
        });

    //rootscope.$apply() had to be moved
    $rootScope.$apply();

我以前试过将`$rootScope.$apply()放在promise链之后,但当然没有在其中返回仍然会使其无法正常工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49820674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档