使用mocha的异步'完成'功能以及角度的注入器

时间:2014-12-12 13:38:04

标签: angularjs unit-testing mocha

我发现自己无法弄清楚如何使用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

有没有人有办法让这项工作?

1 个答案:

答案 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的控制流将搞砸。
  • Mocha主要是功能样式而不是OO方法样式,因此将it分配给对象并将其称为方法不是必需的或有意的。您可以直接致电done