首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >茉莉花单元测试带有两个依赖项的AngularJS工厂($http和另一个工厂返回承诺)

茉莉花单元测试带有两个依赖项的AngularJS工厂($http和另一个工厂返回承诺)
EN

Stack Overflow用户
提问于 2015-07-27 18:44:59
回答 1查看 1.7K关注 0票数 12

我正在使用Ionic框架来定制应用程序。在此过程中,我试图为工厂datastoreServices编写单元测试,它依赖于DomainService$http。我对茉莉花单元测试的实施感到困惑。

我的工厂如下。

代码语言:javascript
复制
app.factory("datastoreServices", ["$http", function($http) {
    return {
        getData: function(data, DomainService) {
            return $http.post(DomainService.host + 'factor', data);
        }
    };
}]);

app.factory('DomainService', function() { //here
    if (ionic.Platform.isAndroid()) {
        return {
            host: 'http://10.0.2.2:7001/'
        }
    }
    return {
        host: 'http://localhost:7001/'
    }
})

我的单元测试框架如下。它有两个依赖项,因此无法确定如何继续进行。这就是我到目前为止在单元测试文件中得到的。

代码语言:javascript
复制
describe(
        'datastoreServices',
        function() {
            beforeEach(module('Myapp'));
            describe('getData'),
                function() {
                    it("Should return correct values", inject(function(datastoreServices, DomainService, $httpBackend) {
                            expect(datastoreServices.getData(httpBackend.. /***something here!**/ )
                                .toEqual("2.2");
                            }))
                    }

我对嘲弄和其他东西知之甚少。谁能帮我测试一下那个工厂的datastoreServices。以下是有待测试的内容:

  • 是Http post进行正确的呼叫吗?
  • 是返回正确承诺的函数吗?

下面是plnkr中类似的app场景。

如果我要求太多的话。提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-30 08:47:46

主要原则是:

  • 在测试过程中会对$http进行模拟,这意味着您的服务器在测试执行过程中实际上没有被调用。
  • 您必须使用$httpBackend来断言http调用和模拟服务器响应https://docs.angularjs.org/api/ngMock/service/$httpBackend。
  • 您可以很容易地注入或模拟测试所需的任何依赖项。

下面是一个基于OP代码的示例:

代码语言:javascript
复制
    describe('datastoreServices', function() {

    beforeEach(module('MyApp'));

    // get a reference to the $httpBackend mock and to the service to test, and create a mock for DomainService
    var $httpBackend, datastoreServices, DomainService;
    beforeEach(inject(function(_$httpBackend_, _datastoreServices_) {
        $httpBackend = _$httpBackend_;
        datastoreServices = _datastoreServices_;
        DomainService = function() {
            return {
                host: 'http://localhost:7001/'
            };
        };
    }));

    // after each test, this ensure that every expected http calls have been realized and only them
    afterEach(function() {
        $httpBackend.verifyNoOutstandingExpectation();
        $httpBackend.verifyNoOutstandingRequest();
    });


    it('calls http backend to get data', function() {
        var data = {foo: 'bar'};

        // write $http expectation and specify a mocked server response for the request
        // see https://docs.angularjs.org/api/ngMock/service/$httpBackend
        $httpBackend.expectPOST('http://localhost:7001/factor', data).respond(201, {bar: 'foo'});

        var returnedData;
        datastoreServices.getData(data, DomainService).success(function(result) {
            // check that returned result contains
            returnedData = result;
            expect(returnedData).toEqual({bar: 'foo'});
        });

        // simulate server response
        $httpBackend.flush();

        // check that success handler has been called
        expect(returnedData).toBeDefined();
    });
});
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31660878

复制
相关文章

相似问题

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