Sinon.stub и Ember App

Как «стабать» методы в Sinon расписано подробно в самой документации. А вот как быть в Ember с computed-свойствами? Предположим, что есть объект вида:

App.Obj = Ember.Object.create({
 
	/* ....... */
	memFree: 0,
 
	memTotal: 100
 
	memoryUsage: function () {
		if (this.get('memFree') && this.get('memTotal')) {
			var memUsed = this.get('memTotal') - this.get('memFree');
			return (100 * memUsed) / this.get('memTotal');
		}
		return 0;
	}.property('memTotal', 'memFree')
	/* ....... */
});

Предположим, что в этом объекте есть методы, в которых используется memoryUsage и необходимо протестировать их. Для упрощения тестовых данных нужно memoryUsage сделать «обычным» свойством. Вариант с set не сработает:

var o = App.Obj.create();
o.set('memoryUsage', 42);

Если же использовать reopen, то все будет как надо:

var o = App.Obj.create();
o.reopen({memoryUsage: 42});
o.get('memoryUsage');

Вроде бы и говорить не о чем. Но, если в качестве подопытного объекта у нас будет сам App? То есть, в App присутствует какое-то computed-property, которое должно подставляться из тестовых данных. Тут вариант с reopen не подойдет, так как App — глобальный объект, с которым работает все приложение (и все тесты) и что-то в нем так явно переопределять очень опасно (App.Obj для каждого теста скорее всего будет создаваться заново и такой проблемы с ним нет).

Посмотрим на ситуацию с другой стороны. Не будет трогать вычисляемое свойство, а попробуем поработать над get-методом:

sinon.stub(App, 'get', function(key) {
	if ('needed' === key) return 'test_value';
	return Ember.get(App, key);
});
/* Не забываем после выполнения теста сделать restore для измененных методов */
App.get.restore();

Что получается? Для одного (ну или сколько надо) теста стандартный get для объекта App меняется нашим методом, который для ключа ‘needed’ возвращает нужное значение (без каких-либо подсчетов). А вот, если из App берется какое-то другое свойство, то вызовется Ember.get (App.get нельзя, так как мы и так в нем), который принимает параметрами объект и ключ, по которому надо взять значение. В конце теста делается restore для get и никаких следов «внешнего» вмешательства не остается.

Финт довольно простой, но при написании тестов экономит много затрат на создание тестового окружения.

Оставить комментарий

Top ↑ | Main page | Back