diff -r 322d0feea350 -r 89ef5ed3c48b src/cm/media/js/lib/yui/yui_3.10.3/docs/test/test-simple-example.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/cm/media/js/lib/yui/yui_3.10.3/docs/test/test-simple-example.html Tue Jul 16 14:29:46 2013 +0200 @@ -0,0 +1,635 @@ + + + + + Example: Simple Testing Example + + + + + + + + + + +
+
+

+
+ + Jump to Table of Contents + + +

Example: Simple Testing Example

+
+
+
+
+

This example shows basic usage of the YUI Test framework for testing browser-based JavaScript code. + Two different TestCase objects are created and added to a + TestSuite object. The TestRunner + is then used to run the tests once the page has loaded.

+
+ +
+
+ + + +
+ +

Simple Test Example

+ +

This example begins by creating a namespace:

+
Y.namespace("example.test");
+ +

This namespace serves as the core object upon which others will be added (to prevent creating global objects).

+ +

Creating the first TestCase

+ +

The first step is to create a new Y.Test.Case object called DataTestCase. + To do so, using the Y.Test.Case constructor and pass in an object literal containing information about the tests to be run:

+
Y.example.test.DataTestCase = new Y.Test.Case({
+
+    //name of the test case - if not provided, one is auto-generated
+    name : "Data Tests",
+
+    //---------------------------------------------------------------------
+    // setUp and tearDown methods - optional
+    //---------------------------------------------------------------------
+
+    /*
+     * Sets up data that is needed by each test.
+     */
+    setUp : function () {
+        this.data = {
+            name: "test",
+            year: 2007,
+            beta: true
+        };
+    },
+
+    /*
+     * Cleans up everything that was created by setUp().
+     */
+    tearDown : function () {
+        delete this.data;
+    },
+
+    //---------------------------------------------------------------------
+    // Test methods - names must begin with "test"
+    //---------------------------------------------------------------------
+
+    testName : function () {
+        var Assert = Y.Assert;
+
+        Assert.isObject(this.data);
+        Assert.isString(this.data.name);
+        Assert.areEqual("test", this.data.name);
+    },
+
+    testYear : function () {
+        var Assert = Y.Assert;
+
+        Assert.isObject(this.data);
+        Assert.isNumber(this.data.year);
+        Assert.areEqual(2007, this.data.year);
+    },
+
+    testBeta : function () {
+        var Assert = Y.Assert;
+
+        Assert.isObject(this.data);
+        Assert.isBoolean(this.data.beta);
+        Assert.isTrue(this.data.beta);
+    }
+
+});
+ +

The object literal passed into the constructor contains a number of different sections. The first section contains the name property, + which is used to determine which Y.Test.Case is being executed. A name is necessary, so one is generated if it isn't specified.

+

Next, the setUp() and tearDown() methods are included. The setUp() method is used in a Y.Test.Case + to set up data that may be needed for tests to be completed. This method is called immediately before each test is executed. For this example, + setUp() creates a data object. The tearDown() is responsible for undoing what was done in setUp(). It is + run immediately after each test is run and, in this case, deletes the data object that was created by setUp. These methods are optional.

+

The last section contains the actual tests to be run. Test method names must always begin with the word "test" (all lowercase) in order + to differentiate them from other methods that may be added to the object.

+

The first test in this object is testName(), which runs + various assertions on data.name. Inside of this method, a shortcut to Y.Assert is set up and used to run three + assertions: isObject() on data, isString() on data.name and areEqual() to compare + data.name to the expected value, "test". These assertions are arranged in order from least-specific to most-specific, + which is the recommended way to arrange your assertions. Basically, the third assertion is useless to run unless the second has passes and the second + can't possibly pass unless the first passed. Both isObject() and isString() accept a single argument, which is the value + to test (you could optionally include a failure message as a second argument, though this is not required). The areEqual() method + expects two arguments, the first being the expected value ("test") and the second being the actual value (data.name).

+

The second and third tests follow the same pattern as the first with the exception that they work with different data types. The testYear() + method works with data.year, which is a number and so runs tests specifically for numbers (areEqual() can be used with + all data types). The testBeta() method works with data.beta, which is a Boolean, and so it uses the isTrue() + assertion instead of areEqual() (though it could also use areEqual(true, this.data.beta)).

+ +

Creating the second TestCase

+ +

Although it's possible that you'll have only one Y.Test.Case object, typically there is more than one, and so this example includes + a second Y.Test.Case. This one tests some of the built-in functions of the Array object:

+
Y.example.test.ArrayTestCase = new Y.Test.Case({
+
+    //name of the test case - if not provided, one is auto-generated
+    name : "Array Tests",
+
+    //---------------------------------------------------------------------
+    // setUp and tearDown methods - optional
+    //---------------------------------------------------------------------
+
+    /*
+     * Sets up data that is needed by each test.
+     */
+    setUp : function () {
+        this.data = [0,1,2,3,4]
+    },
+
+    /*
+     * Cleans up everything that was created by setUp().
+     */
+    tearDown : function () {
+        delete this.data;
+    },
+
+    //---------------------------------------------------------------------
+    // Test methods - names must begin with "test"
+    //---------------------------------------------------------------------
+
+    testPop : function () {
+        var Assert = Y.Assert;
+
+        var value = this.data.pop();
+
+        Assert.areEqual(4, this.data.length);
+        Assert.areEqual(4, value);
+    },
+
+    testPush : function () {
+        var Assert = Y.Assert;
+
+        this.data.push(5);
+
+        Assert.areEqual(6, this.data.length);
+        Assert.areEqual(5, this.data[5]);
+    },
+
+    testSplice : function () {
+        var Assert = Y.Assert;
+
+        this.data.splice(2, 1, 6, 7);
+
+        Assert.areEqual(6, this.data.length);
+        Assert.areEqual(6, this.data[2]);
+        Assert.areEqual(7, this.data[3]);
+    }
+
+});
+ +

As with the first Y.Test.Case, this one is split up into three sections: the name, the setUp() and tearDown() + methods, and the test methods. The setUp() method in this Y.Test.Case creates an array of data to be used by the various + tests while the tearDown() method destroys the array. The test methods are very simple, testing the pop(), push(), + and splice() methods. Each test method uses areEqual() exclusively, to show the different ways that it can be used. + The testPop() method calls pop() on the array of values, then verifies that the length of the array has changed and + that the value popped off is 4; the testPush() pushes a new value (5) onto the array and then verifies that the length of the array has + changed and that the value is included in the correct location; the testSplice() method tests splice() by removing one + value that's already in the array and inserting two in its place.

+ +

Creating the TestSuite

+

To better organize the two Y.Test.Case objects, a Y.Test.Suite is created and those two Y.Test.Case objects are + added to it:

+
Y.example.test.ExampleSuite = new Y.Test.Suite("Example Suite");
+Y.example.test.ExampleSuite.add(Y.example.test.DataTestCase);
+Y.example.test.ExampleSuite.add(Y.example.test.ArrayTestCase);
+ +

The first line creates a new Y.Test.Suite object using its constructor, which accepts a single argument - the name of the suite. As with + the name of a Y.Test.Case, the Y.Test.Suite name is used to determine where execution is when tests are being executed. Although + not required (one is generated if it's not provided), it is recommended that you select a meaningful name to aid in debugging.

+

Any number of Y.Test.Case and Y.Test.Suite objects can be added to a Y.Test.Suite by using the add() + method. In this example, the two Y.Test.Case objects created earlier are added to the Y.Test.Suite.

+ +

Running the tests

+ +

With all of the tests defined, the last step is to run them. This initialization is assigned to take place when all of the YUI + components have been loaded:

+ +
//create the console
+(new Y.Test.Console({
+    verbose : true,
+    newestOnTop : false
+})).render('#testLogger');
+
+Y.Test.Runner.add(Y.example.test.ExampleSuite);
+
+//run the tests
+Y.Test.Runner.run();
+ + +

Before running the tests, it's necessary to create a Y.Test.Console object to display the results (otherwise the tests would run + but you wouldn't see the results). After that, the Y.Test.Runner is loaded with the Y.Test.Suite object by calling + add() (any number of Y.Test.Case and Y.Test.Suite objects can be added to a Y.Test.Runner, + this example only adds one for simplicity). The very last step is to call run(), which begins executing the tests in its + queue and displays the results in the Y.Test.Console.

+ +

Complete Example Source

+ +
<div id="testLogger"></div>
+
+<script>
+YUI().use('node', 'test-console', 'test', function (Y) {
+
+    Y.namespace("example.test");
+
+    Y.example.test.DataTestCase = new Y.Test.Case({
+
+        //name of the test case - if not provided, one is auto-generated
+        name : "Data Tests",
+
+        //---------------------------------------------------------------------
+        // setUp and tearDown methods - optional
+        //---------------------------------------------------------------------
+
+        /*
+         * Sets up data that is needed by each test.
+         */
+        setUp : function () {
+            this.data = {
+                name: "test",
+                year: 2007,
+                beta: true
+            };
+        },
+
+        /*
+         * Cleans up everything that was created by setUp().
+         */
+        tearDown : function () {
+            delete this.data;
+        },
+
+        //---------------------------------------------------------------------
+        // Test methods - names must begin with "test"
+        //---------------------------------------------------------------------
+
+        testName : function () {
+            var Assert = Y.Assert;
+
+            Assert.isObject(this.data);
+            Assert.isString(this.data.name);
+            Assert.areEqual("test", this.data.name);
+        },
+
+        testYear : function () {
+            var Assert = Y.Assert;
+
+            Assert.isObject(this.data);
+            Assert.isNumber(this.data.year);
+            Assert.areEqual(2007, this.data.year);
+        },
+
+        testBeta : function () {
+            var Assert = Y.Assert;
+
+            Assert.isObject(this.data);
+            Assert.isBoolean(this.data.beta);
+            Assert.isTrue(this.data.beta);
+        }
+
+    });
+
+    Y.example.test.ArrayTestCase = new Y.Test.Case({
+
+        //name of the test case - if not provided, one is auto-generated
+        name : "Array Tests",
+
+        //---------------------------------------------------------------------
+        // setUp and tearDown methods - optional
+        //---------------------------------------------------------------------
+
+        /*
+         * Sets up data that is needed by each test.
+         */
+        setUp : function () {
+            this.data = [0,1,2,3,4]
+        },
+
+        /*
+         * Cleans up everything that was created by setUp().
+         */
+        tearDown : function () {
+            delete this.data;
+        },
+
+        //---------------------------------------------------------------------
+        // Test methods - names must begin with "test"
+        //---------------------------------------------------------------------
+
+        testPop : function () {
+            var Assert = Y.Assert;
+
+            var value = this.data.pop();
+
+            Assert.areEqual(4, this.data.length);
+            Assert.areEqual(4, value);
+        },
+
+        testPush : function () {
+            var Assert = Y.Assert;
+
+            this.data.push(5);
+
+            Assert.areEqual(6, this.data.length);
+            Assert.areEqual(5, this.data[5]);
+        },
+
+        testSplice : function () {
+            var Assert = Y.Assert;
+
+            this.data.splice(2, 1, 6, 7);
+
+            Assert.areEqual(6, this.data.length);
+            Assert.areEqual(6, this.data[2]);
+            Assert.areEqual(7, this.data[3]);
+        }
+
+    });
+
+    Y.example.test.ExampleSuite = new Y.Test.Suite("Example Suite");
+    Y.example.test.ExampleSuite.add(Y.example.test.DataTestCase);
+    Y.example.test.ExampleSuite.add(Y.example.test.ArrayTestCase);
+
+    //create the console
+    (new Y.Test.Console({
+        newestOnTop : false,
+        filters: {
+            pass: true,
+            fail: true
+        }
+    })).render('#testLogger');
+
+    Y.Test.Runner.add(Y.example.test.ExampleSuite);
+
+    //run the tests
+    Y.Test.Runner.run();
+
+});
+</script>
+ +
+
+
+ +
+ +
+
+
+ + + + + + + + + + +