How to programmatically embed html into qunit-fixture

I would like to programmatically inject html for testing into qunit-fixture. I tried with $ .load, but the JS working with HTML gets fired before the html is loaded.

HTML:

<div id="qunit"></div>
<div id="qunit-fixture"></div>

<script src="../components/bower/qunit/qunit/qunit.js"></script>
<script>
  QUnit.config.autostart = false;
</script>

<script data-main="tests" src="../components/bower/requirejs/require.js"></script>

      

JS manipulating html is the module I want to test:

define(['jquery'], function($) {

  'use strict';

  var Foo = {
    _init: function() {
      this._addClass();
    },
    _addClass: function() {
      console.log('adding class testit');
      $('.foo').addClass('testit');
    },
    greet: function() {
      return "Hello";
    }
  };

  Foo._init();

  return {
    greet : Foo.greet
  };

});

      

And my test:

define(['foo'], function(foo) {

  'use strict';

  var Test = {
    test: function() {
      module( "module Foo");
      asyncTest("foo class test", function() {
        expect(1);
        // foo() is executed before load is done :(
        $('#qunit-fixture').load('../components/app/foo/foo.html', function(data) {
          ok($('.foo').hasClass('testit'), ".foo should have class 'testit'");
          QUnit.start();
        });
      });
    }
  };

  return {
    test: Test.test
  };

});

      

+3


source to share


1 answer


Since content loading is asynchronous, you need to tell QUnit to wait before starting . Please note that this is just an assumption about what your test harness looks likeit will most likely be updated for your use case.

<!-- in your test HTML document -->
<script>
QUnit.config.autostart = false;

// your code to load the HTML dynamically in the fixture

// your test definitions

require(
    [ "src/yourSourceCode", "tests/theTests" ],
    function() {
        QUnit.start(); // this starts the main QUnit code
    }
);

</script>

      

UPDATE

It looks like the OP actually stops QUNit execution right away, the problem (see comment below) is that the module code is executed before the HTML is loaded dynamically. I think it has to do with the method being _init()

called inside the module. Instead, return the method _init

as a property of the module and call it from your test:



define(['jquery'], function($) {

  'use strict';

  var Foo = {
    _init: function() {
      ...
    },
    ...
  };

  // Foo._init(); // don't do this here...

  return {
    greet : Foo.greet,
    init : Foo._init    // add the init method to your exports
  };

});

      

Now, in your test, you can do:

define(['foo'], function(foo) {

  'use strict';

  var Test = {
    test: function() {
      module( "module Foo");
      asyncTest("foo class test", function() {
        expect(1);

        $('#qunit-fixture').load('../components/app/foo/foo.html', function(data) {

          foo.init(); // we've moved the initialization to here...

          ok($('.foo').hasClass('testit'), ".foo should have class 'testit'");
          QUnit.start();
        });
      });
    }
  };

  return {
    test: Test.test
  };

});

      

+2


source







All Articles