Angularjs   发布时间:2022-04-20  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了angularjs – 使用默认承诺进行角度/茉莉花测试大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用角度和茉莉花的组合来测试控制器,并且我不完全确定使用认的承诺.

这是我的规范代码.

describe('Controller Tests',function(){
    var scope,searchAPI;

    beforeEach(function(){
        var mockSearchAPI = {};
        module('myApp',function($providE){
            $provide.value('searchAPI',mockSearchAPI);
        });
    });

    inject(function($q){
        var testData = {"message":"hi"};
        mockSearchAPI.executeSearch = function(){
            var defer = $q.defer();
            defer.resolve(testData);
            return defer.promise;
        };
    });

    beforeEach('Main Search Controller Tests',function(){

        function($controller,$rootScope,_searchAPI_){
            scope = $rootScope.$new();
            searchAPI = _searchAPI_;
            $controller('MainSearchCtrl',function(){
                $scope: scope,searchAPI: searchAPI
            });
            scope.$digest();
        }
    });

    it('should return a promise correctly',function(){
        var field = "testfield";
        var value = "testvalue";
        var pagenumber = 1;
        var promise = scope.processQueryByField(field,value,pagenumber);

        //THIS LINE IS GIVING ME '{}'
        alert(promisE); 
    });

});

我不确定为什么我“警告”的行给了我'{}’的输出.它不应该是我在注入函数中定义为“testData”的数据结构吗?我不确定这里发生了什么.我尝试了很多解决方案.

我的控制器代码基本上是服务的包装器

$scope.processQueryByField = function(field,pagenumber){
    return searchAPI.executeSearch(field,pagenumber);
}

我不应该只接收我在进样器代码中定义的值吗?

解决方法

我不确定您希望使用promise对象设置什么期望,您不需要测试是否已解决promise,而是需要测试解析promise时数据会发生什么.

例:-

更改您的模拟以简化: –

inject(function($q){
    var testData = {"message":"hi"};
    mockSearchAPI.executeSearch = function(){
       return $q.when(testData);
    };
});

只是为了演示我在你的控制器中添加了另一个解决了数据的方法: –

.controller('MainSearchCtrl',['$scope','searchAPI',function ($scope,searchAPI) {
        //At this point placing this method on scope is uSELEss
        $scope.processQueryByField = function(field,pagenumber){
           return searchAPI.executeSearch(field,pagenumber);
        }
        //This when invoked will update the searchResults in the model.
        $scope.populateData = function(){
          $scope.processQueryByField(1,1,1).then(function(data){
            $scope.searchResults = data;
          })
        }
    }]);

期望#1: – 测试在调用方法时是否使用预期参数调用api方法.

it('should invoke execute search',function(){
     //Set up a spy on your mock api method
      spyOn(mockSearchAPI,'executeSearch'); 
      var field = "testfield";
      var value = "testvalue";
      var pagenumber = 1;
      scope.processQueryByField(field,pagenumber); //invoke scope method with args
      //Test if the mock api method has been called
      expect(mockSearchAPI.executeSearch).toHaveBeenCalled();          
      //test if it has been called with expected arguments.
      expect(mockSearchAPI.executeSearch).toHaveBeenCalledWith(field,pagenumber); 
    });

期望#2: – 在解决承诺时测试数据是否正确填充.

it('should return a promise correctly',function(){
    var field = "testfield";
    var value = "testvalue";
    var pagenumber = 1;

    var promise = scope.processQueryByField(field,pagenumber);
    //This is a uSELEss expectation
    expect(promisE).toBeDefined();


    scope.populateData();
    $rootScope.$digest(); //<-- Apply digest cycle,so the promise is resolved
    expect(scope.searchResults).toBeDefined();
    expect(scope.searchResults.messagE).toEqual("hi");
});

Test Demo

大佬总结

以上是大佬教程为你收集整理的angularjs – 使用默认承诺进行角度/茉莉花测试全部内容,希望文章能够帮你解决angularjs – 使用默认承诺进行角度/茉莉花测试所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。