AngularJS 依存を持つ filter のテスト
myApp = angular.module('myApp', [ 'myApp.filters', 'myApp.services' ]);
myApp.services = angular.module('myApp.services', []);
myApp.services.factory('loc', function () {
return Location.parse(location.href);
});
myApp.filters = angular.module('myApp.filters', []);
myApp.filters.filter('page', function (loc) {
return function (page) {
return loc.params(angular.extend(loc.params(), { page : page })).href;
};
}); services と filters のモジュールをわけて以上のようなのを実装した場合で、page filter をテストしたい場合、以下のようにするとエラーになる。
describe('filter', function () {
beforeEach(module('myApp.filters'));
describe('page', function () {
it('should append page param', function () {
inject(function (pageFilter) {
expect(pageFilter(1)).toBe('foobar');
});
});
});
});
//=> Error: [$injector:unpr] Unknown provider: locProvider <- loc <- pageFilter loc の定義が別モジュールで、beforeEach で該当モジュールを読みこんでいないからだけど、そもそも DI で loc を注入してテストしたいところだと思う。
とりあえず以下のようにしたうまくいった。
describe('filter', function () {
beforeEach(module('myApp.filters'));
describe('page', function () {
it('should append page param', function () {
module(function ($provide) {
$provide.factory('loc', function() {
return Location.parse('http://localhost/foo');
});
});
inject(function (pageFilter) {
expect(pageFilter(1)).toBe('http://localhost/foo?page=1');
});
});
it('should append page param', function () {
module(function ($provide) {
$provide.factory('loc', function() {
return Location.parse('http://localhost/foo?foo=bar');
});
});
inject(function (pageFilter) {
expect(pageFilter(1)).toBe('http://localhost/foo?foo=bar&page=1');
});
});
});
}); $provide でテスト用の loc factory を定義してやる。
関連エントリー
- Angular JS でビューを伴う Service ってどう書けばいいんですか 続きをかきました。 [tech] Angular JS で View を伴う Service 的なことをしたいとき、あるいは Directi...
- AngularJS で http リクエスト中画面内のボタンを disabled にする とにかく面倒だから全部の http リクエストを監視してボタンをオフにしたい。という要件 いまいちいい方法が思いうかばないけど以下のようにし...
- Perl の Locale::Maketext::Lexicon::Gettext フォーマットのメッセージをJSでフォーマットする Perl の Locale::Maketext::Lexicon::Gettext は以下のような Gettext ライクなフォーマットを扱...
- JSDeferred -> Angular $q 置き換え方法 AngularJS には $qっていう promise の枠組みがあるので、使っておくといいこと (ビューが自動的に更新されるだけだけど) ...
- AngularJS のテストでページ側のスクリプトを実行する protractor (webdriver) を使った場合、外から executeAsyncScript を使うと文字列でページ側で実行でき...