2017-08-04 63 views
0

這是我做了100次的事情,但是對於我的生活無法解決這裏發生的事情。

我已經有了這個現有的測試模塊,其中所有20+測試都完美地工作。

現在我正在嘗試將$q添加到此服務中以獲取新方法。我用我以前使用的完全一樣的方法,但由於某種原因$q未定義:

describe('CacheService module',() => { 
    let cacheService, $q, $scope; 

    beforeEach(() => { 
    angular.mock.module('app.CacheService', ($provide) => { 
     $provide.value('$q', $q); 
    }); 

    inject((_$rootScope_, _$q_, _CacheService_) => { 
     $scope = _$rootScope_.$new(); 
     $q = _$q_; 

     cacheService = _CacheService_; 

     console.log(_$q_); // undefined 
    }); 
    }); 
}); 

下測試服務聲明:

angular.module('app.CacheService', []).service('CacheService', [ '$q', function($q) { 
    .... 
}]); 

感謝

回答

1

你爲什麼在模塊定義中爲$ q提供一個值?您$作爲$ q提供的值是未定義的,因此當您處於注入塊時未定義。您的代碼應該是這樣的:

describe('CacheService module',() => { 
    let cacheService, $q, $scope; 

    beforeEach(() => { 
    //angular.mock.module('app.CacheService', ($provide) => { 
    // $provide.value('$q', $q); 
    //}); 
    // Do not provide a custom value for $q that is undefined 
    angular.mock.module('app.CacheService'); 

    // Now $q will come from angular instead of your provided value, 
    // which was undefined since you never set it. 
    inject((_$rootScope_, _$q_, _CacheService_) => { 
     $scope = _$rootScope_.$new(); 
     $q = _$q_; 

     cacheService = _CacheService_; 

     console.log(_$q_); // Should now be defined... 
    }); 
    }); 
}); 

具體而言,您可以使用與$功能在測試時提供要覆蓋現有定義。例如,如果您正在測試依賴於使用$ http的服務的控制器,那麼您可能只想爲服務中的所有這些方法(例如間諜)創建存根。

+0

啊!你是對的!實際上我在我的實際代碼中注入了另一個模擬服務,所以我仍然需要提供block,但是從它中刪除'$ provide.value('$ q',$ q)'已經修復了它。謝謝。 – James

+0

我只是把它拿出來,因爲在你的例子中你沒有設置任何其他東西。絕對需要它,如果你提供嘲笑。很高興現在正在工作。 – Patrick