2015-09-07 113 views
2

在我的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

我不想測試運行塊,但它在我的測試中加載模塊時自動執行,然後調用我不想要的服務 –

回答

3

在這種情況下是很重要的訂單。

你需要加載你的應用程序第一

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。有沒有其他辦法可以做到這一點? –