在spyOn服务中获取promise中的函数返回值 - Jasmine Angularjs

时间:2018-02-14 18:09:29

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

我正在测试一个从promise接收值的函数,并将此值(字符串)连接到url。函数的实现没问题。

  var resp = {"payment": {
    "additional_information": {
      "skuSeatIds": "[{\"sku\":\"5234\",\"Description\":\"Advanced\",\"seatId\":792}]"
    }}};


   var promise = Promise.resolve(JSON.parse(resp.payment.additional_information.skuSeatIds));
   var update = spyOn(doneService, 'getOrderInfo').and.returnValue(promise);


   var url = controller.setSeatIdLink();
   expect(url).toBe('http://localhost:4000/#!/search?type=Selector&seatId=792');
});

然后我有调用doneService.getOrderInfo()

的函数
  function setSeatIdLink () {
    doneService.getOrderInfo(store.get('orderId')).then(function(resp){
           var stri = vm.modalSelectorUrl.concat(resp[0].seatId);
            vm.modalSelectorUrl = stri;
            return vm.modalSelectorUrl;
    });
  }

vm.modalSelectorUrl正确设置了url。 spyOn返回值很好。如果我记录“vm.modalSelectorUrl”,网址就可以了。但我对期望(网址)未定义...

如果我在.then(function(){...范围之外)对返回进行硬编码,则返回有效。

有什么想法吗?谢谢!

2 个答案:

答案 0 :(得分:0)

这里你的函数setSeatIdLink没有返回任何内容。 返回语句在then函数内,而不在setSeatIdLink函数中。 这就是它返回undefined的原因,它存储在url中。

尝试断言vm.modalSelectorUrl

function setSeatIdLink () {
    doneService.getOrderInfo(store.get('orderId')).then(function(resp){
           var stri = vm.modalSelectorUrl.concat(resp[0].seatId);
            vm.modalSelectorUrl = stri;
            return vm.modalSelectorUrl;
    });
  }

<强>更新

像这样更改你的功能

function setSeatIdLink() {
    var defer = $q.defer();
    doneService.getOrderInfo(store.get('orderId')).then(function (resp) {
        var stri = vm.modalSelectorUrl.concat(resp[0].seatId);
        vm.modalSelectorUrl = stri;
        defer.resolve(vm.modalSelectorUrl);
    });
    return defer.promise;
}

和这样的测试案例

it('testcase', function (done) {
    //your code
    var url = controller.setSeatIdLink().then(function (url) {
        expect(url).toBe('http://localhost:4000/#!/search?type=Selector&seatId=792');
        done();
    });
    $scope.$apply();
});

答案 1 :(得分:0)

您需要返回一个返回promise的函数。如果你使用AngularJS最好坚持使用$ q,虽然我确信无论哪种方式都能正常工作。

var mock_func = function(data) {
   return $q.resolve(data);
};

spyOn(func, 'method').and.callFake(mock_func({
   data: 'to_return'
}));