我发现自己无法弄清楚如何使用mocha的异步完成功能与角度注入器。我尝试过这样的事情:
describe('myService', function() {
beforeEach(module('myModule'));
describe('action()', function() {
var obj = {};
before(function(done) {
obj.done = done;
});
it('calls a function async', inject(function(myService) {
myService.calledAsync = function() {
obj.done()
};
myService.action();
});
});
});
但这并不起作用,因为it
函数永远不会运行。所以before
只是超时了。
我还尝试在第二个参数周围包装注入来描述和运行before函数内的整个测试体(正如tj这里所建议的那样:https://github.com/mochajs/mocha/issues/253)。但这给了我错误Uncaught TypeError: Cannot read property '$modules' of null
。
有没有人有办法让这项工作?
答案 0 :(得分:3)
我认为您需要解决的主要问题是:1。请勿在{{1}}期间尝试保存done
并稍后再调用它2.将before
移开inject
最多it
,因此您的beforeEach
可以正常it
。
这是适用于我的布局样板:
function(done) {
来自您的代码段的一些misc提示:
describe('myService', function () {
// declare injected variables here so they are available to tests
// via closure
var httpBackend, rootScope, controller, myService;
// Then mock out your module with a beforeEach
beforeEach(module('myModule'));
// inject another beforeEach to get what you need
beforeEach(inject(function ($rootScope, $controller, $httpBackend, _myService_) {
httpBackend = $httpBackend;
rootScope = $rootScope;
controller = $controller;
myService = _myService_;
});
});
// Just an example
afterEach(function() {
httpBackend.verifyNoOutstandingExpectation();
httpBackend.verifyNoOutstandingRequest();
});
// Do a regular `it` function
it('should ', function(done) {
myService.calledAsync = function() {
done();
};
myService.action();
});
});
的引用。每个生命周期点都是截然不同的,所以如果mocha在done
中为你提供了一个done
函数,它具有语义"在每次调用时都会被调用",所以如果你试图保存它稍后在beforeEach
内部调用mocha的控制流将搞砸。it
分配给对象并将其称为方法不是必需的或有意的。您可以直接致电done
。