protractor (webdriver) を使った場合、外から executeAsyncScript を使うと文字列でページ側で実行できる。

けど、文字列で渡すとか、シンタックスチェックもかからないし、ありえないので、定義自体は普通に書きたい。ので以下のような関数を定義する。

var PageObject  = function () {
	this.exec = function (func) {
		var args = Array.prototype.slice.call(arguments, 0);
		args[0] = '('+ (func.toString()) + ').apply(null, arguments);';
		browser.executeAsyncScript.apply(browser, args);
	};

	this.createEntry = function (data) {
		this.exec(function (data, callback) {
			angular.injector(['myApp']).invoke(function (Entry) {
				var entry = new Entry();
				for (var key in data) if (data.hasOwnProperty(key)) entry[key] = data[key];
				entry.$save(callback);
			});
		}, data);

		return data;
	};
};

この例では、定義した exec 関数を使って、ページ側の ngResource で定義したクラスを使い、テスト用のデータを生成する createEntry メソッドを定義している。

  1. トップ
  2. angularjs
  3. AngularJS のテストでページ側のスクリプトを実行する
  1. トップ
  2. tech
  3. AngularJS のテストでページ側のスクリプトを実行する
▲ この日のエントリ