与茉莉花中 ES6 承诺的 then/catch 方法同步
Synchronize with then/catch method of ES6 Promises in Jasmine
我有一个角度控制器需要测试。此控制器调用服务以从服务器检索数据。该服务返回 ES6 承诺。
function MyController($scope, MyService) {
$scope.doSomething = function () {
MyService.foo().then() {
whatever...;
};
};
};
在我的茉莉花测试中,我也嘲笑了返回承诺的服务:
var resolve;
var reject;
createPromise = function () {
return new Promise(function (_resolve, _reject) {
resolve = _resolve;
reject = _reject;
});
};
var myServiceMock = {
doSomething: jasmine.createSpy('doSomething').and.callFake(createPromise)
};
beforeEach(module('someApp', function ($provide) {
$provide.value('MyService', myServiceMock);
}));
我手动调用全局解析(或拒绝),无论是否带有参数来检查我的控制器。
it('shall call the service', function () {
$scope = $rootScope.$new();
controller = $controller('MyService', { $scope: $scope });
controller.doSomething();
myService.resolve();
expect(whatever...);
});
问题是解析调用是异步的。所以我正在测试我的预期结果,同时运行 then 函数。
我没有返回 Promises,而是尝试返回简单的自定义对象,该对象会将 resolve 转换为同步调用,但事实证明 Promise 有一些特定的规则,这些规则太麻烦了,无法在模拟中重新实现(例如当你有 then.()。例如 catch().then 模式)。
有没有办法在茉莉花中以简单而同步的方式测试这种东西?
你需要告诉 Jasmine 你的测试是异步的,它应该等待它完成,然后再决定它失败了。为此,您可以在规范声明中添加一个 done
参数(it
调用),并在期望结束时调用done
:
it('shall call the service', function (done) {
$scope = $rootScope.$new();
controller = $controller('MyService', { $scope: $scope });
var promise =
controller.doSomething()
.then(function() {
expect(whatever...);
done();
});
myService.resolve();
});
使模拟自动解析的一种更简单方法是使用 Promise.resolve
方法:
doSomething: jasmine.createSpy('doSomething').and.returnValue(Promise.resolve())
然后,您无需调用myService.resolve
- 模拟会自动返回已解决的承诺。
我最近开始使用 jasmine-promise 模块,它使编写 promise 调用变得更加容易 - 并确保如果 promise 被拒绝,则会报告错误和调用堆栈,以便于调试。有了jasmine-promises
,这将变成:
it('shall call the service', function () {
$scope = $rootScope.$new();
controller = $controller('MyService', { $scope: $scope });
return controller.doSomething()
.then(function() {
expect(whatever...);
});
});
相关文章:
- electronic BrowserWindow的最小高度和宽度在hide()show()方法之后不起作用
- 有没有任何方法可以将控制器从文件加载到ui路由器$stateProvider中
- 数组在递归方法中设置为null
- 打破承诺链的好方法是什么
- 在使用Polymer'加载所有json文件后执行方法;s的核心ajax
- 节点Js:How to catch a“;没有这样的文件或目录“;读取线模块出错
- 使用“;这个“;JavaScript原型方法中的关键字
- 序列化数据属性中对象的最可靠方法
- 使用Objective-C的JavaScript注入方法
- 有没有一种方法可以将try-catch添加到Javascript中的每个函数中
- 在 JavaScript 中用“try catch”包装每个方法的性能问题
- 与茉莉花中 ES6 承诺的 then/catch 方法同步
- 用try-catch包装现有javascript对象的所有方法
- 使用try-catch检索嵌套属性的值.这是一个有效的方法吗?
- 有没有一种方法可以在函数中注入try catch ?
- 引导模式.Catch Uncaught TypeError:Object[Object Object]没有方法'
- jQuery方法抛出新的错误-没有被外部的try / catch块捕获
- 如果变量未定义,try / catch是防止错误发生的最佳方法之一吗?
- 在Spring Tool Suite (Eclipse)中导致错误的Javascript catch方法
- 在try/catch块中包装promise是正确的方法吗