我正在测试一个从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(){...范围之外)对返回进行硬编码,则返回有效。
有什么想法吗?谢谢!
答案 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'
}));