2015-11-16 43 views
2

當我測試我的AngularJS應用程序時,我一直遇到問題,我嘗試並注入所有依賴項,但它似乎沒有工作,任何幫助是非常感謝:)

這是一個相當大的應用程序,我試圖儘可能打破事情,並測試他們,但我們有一個叫做firebaseUser的工廠,你可以猜到firebaseUser。我們還有一個稱爲userInstance的實例,所以每當我嘗試和模擬userInstance時都會收到錯誤。

describe('Dashboard Start Controller', function() { 

    var scope, ctrl; 

    beforeEach(function() { 
    MockFirebase.override(); 
    module('noodleApp.start'); 
    module('noodleApp.noodleFactory'); 
    module('noodleApp.firebaseUser'); 
    module('noodleApp.start'); 
    }); 

    beforeEach(inject(function($rootScope, $controller, $injector) { 
    scope = $rootScope.$new(); 
    ctrl = $controller('StartController', {$scope: scope}); 
    })); 

    afterEach(function() { 
    scope.$destroy(); 
    }); 

    it('should be available', function() { 
    expect(ctrl).toBeDefined(); 
    }); 

    it('should init with filter being set to all', function() { 
    expect(scope.filterOn).toBe('all'); 
    }); 
}); 

每當我運行這個測試,我得到以下錯誤:Unknown provider: userInstanceProvider <- userInstance <- StartController

+1

在你的代碼示例中,沒有「userInstance」。所以它似乎被加載到另一個文件中。您的測試是否可以訪問包含userInstance工廠的文件?是所有的文件加載?你可能需要像模塊('noodleApp.userInstance');或者可能像scope.userInstance = xyz?只是一個猜測...... :) – timtos

+0

您是否將userInstance工廠的模塊名稱作爲StartController或第一個'beforeEach()'中列出的其他模塊之一的依賴項?該錯誤表明它缺少所有這些(它們必須在其中至少一箇中被引用)。 – HankScorpio

+0

userInstance不是工廠,它是工廠的實例,它是工廠的返回,所以它在技術上不是我可以包含的模塊 – Grant

回答

1

$controller$inject一個電話,但作爲一個服務處理。會發生什麼是您正在實例化控制器,但因爲使用了$inject,而您沒有通過userInstance,它會查找找不到的提供程序。您需要確保將服務/工廠/解決方案傳遞給您的方法$controller。通過嘲笑它並將其傳遞給控制器​​,您可以隔離您期望發生的情況,並僅在本單元測試中測試控制器。

beforeEach(inject(function($rootScope, $controller) { 
    scope = $rootScope.$new(); 
    userInstanceMock = { 
     // mock out all methods here 
     foo: sinon.stub() 
    } 
    ctrl = $controller('StartController', { 
     $scope: scope, 
     userInstace: userInstaceMock 
    }); 
})); 
相關問題