ソースを参照

Implemented testUtils.createObserver and improved tests descriptions.

Piotrek Koszuliński 9 年 前
コミット
891c6a89fd

+ 39 - 0
packages/ckeditor5-utils/tests/_utils/utils.js

@@ -5,7 +5,10 @@
 
 'use strict';
 
+/* global console:false */
+
 import amdUtils from '/tests/_utils/amd.js';
+import EmitterMixin from '/ckeditor5/core/emittermixin.js';
 
 const utils = {
 	/**
@@ -62,6 +65,42 @@ const utils = {
 		}
 
 		return count;
+	},
+
+	/**
+	 * Creates an instance inheriting from {@link core.EmitterMixin} with one additional method `observe()`.
+	 * It allows observing changes to attributes in objects being {@link core.Observable observable}.
+	 *
+	 * The `observe()` method accepts:
+	 *
+	 * * `{String} observableName` – Identifier for the observable object. E.g. `"Editable"` when
+	 * you observe one of editor's editables. This name will be displayed on the console.
+	 * * `{core.Observable observable} – The object to observe.
+	 *
+	 * Typical usage:
+	 *
+	 *		const observer = utils.createObserver();
+	 *		observer.observe( 'Editable', editor.editables.current );
+	 *
+	 *		// Stop listening (method from the EmitterMixin):
+	 *		observer.stopListening();
+	 *
+	 * @returns {Emitter} The observer.
+	 */
+	createObserver() {
+		const observer = Object.create( EmitterMixin, {
+			observe: {
+				value: function observe( observableName, observable ) {
+					observer.listenTo( observable, 'change', ( evt, propertyName, value, oldValue ) => {
+						console.log( `[Change in ${ observableName }] ${ propertyName } = '${ value }' (was '${ oldValue }')` );
+					} );
+
+					return observer;
+				}
+			}
+		} );
+
+		return observer;
 	}
 };
 

+ 57 - 1
packages/ckeditor5-utils/tests/utils-tests/utils.js

@@ -5,13 +5,18 @@
 
 'use strict';
 
+import testUtils from '/tests/_utils/utils.js';
 import amdTestUtils from '/tests/_utils/amd.js';
 import coreTestUtils from '/tests/core/_utils/utils.js';
+import Model from '/ckeditor5/core/ui/model.js';
 import Creator from '/ckeditor5/core/creator.js';
+import EmitterMixin from '/ckeditor5/core/emittermixin.js';
 
 let createFn3 = () => {};
 let destroyFn3 = () => {};
 
+testUtils.createSinonSandbox();
+
 coreTestUtils.defineEditorCreatorMock( 'test1' );
 coreTestUtils.defineEditorCreatorMock( 'test2', {
 	foo: 1,
@@ -63,8 +68,59 @@ describe( 'coreTestUtils.defineEditorCreatorMock()', () => {
 } );
 
 describe( 'coreTestUtils.getIteratorCount()', () => {
-	it( 'should returns number of editable items ', () => {
+	it( 'should returns number of editable items', () => {
 		const count = coreTestUtils.getIteratorCount( [ 1, 2, 3, 4, 5 ] );
 		expect( count ).to.equal( 5 );
 	} );
 } );
+
+describe( 'coreTestUtils.createObserver()', () => {
+	let observable, observable2, observer;
+
+	beforeEach( () => {
+		observer = coreTestUtils.createObserver();
+		observable = new Model( { foo: 0, bar: 0 } );
+		observable2 = new Model( { foo: 0, bar: 0 } );
+	} );
+
+	it( 'should create an observer', () => {
+		function Emitter() {}
+		Emitter.prototype = EmitterMixin;
+
+		expect( observer  ).to.be.instanceof( Emitter );
+		expect( observer.observe ).is.a( 'function' );
+		expect( observer.stopListening ).is.a( 'function' );
+	} );
+
+	describe( 'Observer', () => {
+		/* global console:false  */
+
+		it( 'logs changes in the observable', () => {
+			const spy = testUtils.sinon.stub( console, 'log' );
+
+			observer.observe( 'Some observable', observable );
+			observer.observe( 'Some observable 2', observable2 );
+
+			observable.foo = 1;
+			expect( spy.callCount ).to.equal( 1 );
+
+			observable.foo = 2;
+			observable2.bar = 3;
+			expect( spy.callCount ).to.equal( 3 );
+		} );
+
+		it( 'stops listening when asked to do so', () => {
+			const spy = testUtils.sinon.stub( console, 'log' );
+
+			observer.observe( 'Some observable', observable );
+
+			observable.foo = 1;
+			expect( spy.callCount ).to.equal( 1 );
+
+			observer.stopListening();
+
+			observable.foo = 2;
+			expect( spy.callCount ).to.equal( 1 );
+		} );
+	} );
+} );