将模拟服务注入到Angular模块运行模块

将模拟服务注入到Angular模块运行模块

问题描述:

在我的module.run模块中,它调用了我所做服务的方法。在运行我的测试时,我希望它引用一个模拟服务,而不是真正的http请求。我目前正在尝试测试一个控制器,而不是实际的运行模块本身 - 我如何将模拟服务注入运行功能?我曾尝试使用$ provide.factory,但它似乎没有做任何事情,并仍然正常加载服务。将模拟服务注入到Angular模块运行模块

我正在使用茉莉花写我的测试。

app.js

angular.module("app") 
    .run(function(MyService) { 
     MyService.log("starting app"); 
    }); 

test.js

describe("MyController", function() { 

    beforeEach(function() { 
     module(function ($provide) { 
      $provide.factory("MyService", { log: function(){} }); 
     }); 
    }); 

    // I want module 'app' to execute its run function using injected value for MyService 
    beforeEach(module("app")); 

    beforeEach(inject(function($controller, $rootScope) { 
     MyController = $controller("MyController", { $scope: $rootScope.$new() }); 
    })); 

    ........... 

}); 
+2

正在测试模块的运行块你的基本单元测试? Angular的建议是在独立模块中声明运行块,以便在单元测试中很容易忽略它,请参阅https://docs.angularjs.org/guide/module#run-blocks –

+0

我不想测试运行块,但它在我的测试中加载模块时自动执行,然后调用我不想要的服务 –

在这种情况下是很重要的订单。

你需要加载你的应用程序第一

beforeEach(module("app")); 

,然后改写为MyService定义。

beforeEach(
    module({ 
    "MyService": { 
     log: function(message) { 
     console.log("MyFakeService called: " + message); 
     } 
    } 
    }) 
); 

否则应用服务实现是最后一次注册和使用。

工作示例如下 - 放眼控制台http://plnkr.co/edit/BYQpbY?p=preview

+0

谢谢! –

+0

我正在这样做,但仍然没有得到fakeService。有没有其他办法可以做到这一点? –