如何为requirejs和qunit设置grunt任务

Mar*_*kus 10 javascript qunit requirejs phantomjs grunt-contrib-qunit

我正在尝试使用requirejs和grunt-contrib-qunit设置QUnit环境.

这就是我所拥有的.

gruntfile:

qunit: {
  all: {
    options: {
      urls: [
        'http://localhost:8000/qunit/qunit-test-suite.html'
      ]
    }
  }
},

connect: {
  server: {
    options: {
      port: 8000,
      base: '.'
    }
  }
},
Run Code Online (Sandbox Code Playgroud)

qunit试验suite.html:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>QUnit Tests Suite: travis CI Test</title>
  <link rel="stylesheet" href="../components/libs/qunit/qunit/qunit.css">
</head>
<body>

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

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

  <script data-main="qunit" src="../components/libs/requirejs/require.js"></script>

</body>
</html>
Run Code Online (Sandbox Code Playgroud)

qunit.js:

require.config({
    baseUrl: "../",
    paths: {
      'jquery': 'components/libs/jquery/dist/jquery.min',

      // Test for Foo
      'foo': 'components/app/foo/foo',
      'test-Foo': 'components/app/foo/test-Foo'
    },
    shim: {
     'QUnit': {
       exports: 'QUnit',
       init: function() {
         QUnit.config.autoload = false;
         QUnit.config.autostart = false;
       }
      }
    }
});

require(['test-Foo'], function (Foo) {
  QUnit.load();
  QUnit.start();
});
Run Code Online (Sandbox Code Playgroud)

测试Foo.js:

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

  'use strict';

  module("Foo");

  test("Foo return Test", function() {
    equal(Foo.foo(), "foo", "Function should return 'foo'");
    equal(Foo.oof(), "oof", "Function should return 'oof'");
  });

  test("Bar return Test", function() {
    equal(Foo.bar(), "barz", "Function should return 'bar'");
  });

});
Run Code Online (Sandbox Code Playgroud)

问题是,当我在浏览器中打开test-suite.html时,一切正常.一旦发送到PhantomJS,我收到以下错误:

Running "connect:server" (connect) task
Started connect web server on http://localhost:8000

Running "qunit:all" (qunit) task
Testing http://localhost:8000/qunit/qunit-test-suite.html

>> PhantomJS timed out, possibly due to a missing QUnit start() call.
Warning: 1/1 assertions failed (0ms) Use --force to continue.

Aborted due to warnings.
Run Code Online (Sandbox Code Playgroud)

完整设置:https://github.com/markusfalk/test-travis

测试运行:https://travis-ci.org/markusfalk/test-travis

谢谢你的帮助 :)

Mar*_*kus 4

在J\xc3\xb6rn的帮助下,我想出了一个可行的设置。技巧是在 QUnit 加载之前设置 requireJS(将 requireJS 配置移动到 config.js 并首先加载它)。

\n\n

要求:

\n\n
    \n
  • grunt-contrib-qunit v0.7.0
  • \n
  • qunit v1.18.0
  • \n
\n\n

HTML 测试套件:

\n\n
<!doctype html>\n<html>\n  <head>\n    <meta charset="utf-8">\n    <title>QUnit Tests Suite: asdf</title>\n    <link rel="stylesheet" href="../components/libs/qunit/qunit/qunit.css">\n  </head>\n  <body>\n\n    <div id="qunit"></div>\n    <div id="qunit-fixture"></div>\n\n    <script src="config.js"></script>\n    <script data-main="unit" src="../components/libs/requirejs/require.js"></script>\n\n  </body>\n</html>\n
Run Code Online (Sandbox Code Playgroud)\n\n

配置文件

\n\n
var requirejs = {\n  baseUrl: "../",\n  paths: {\n    //{{app}}\n    \'foo\': \'components/app/foo/foo\',\n    \'test-foo\': \'components/app/foo/test-foo\',\n\n    //{{libs}}\n    \'unit\': \'qunit/unit\',\n    \'qunit\': \'components/libs/qunit/qunit/qunit\',\n    \'jquery.exists\': \'libs/jquery.exists/jquery.exists\',\n    \'jquery\': \'components/libs/jquery/dist/jquery.min\'\n  },\n  \'shim\': {\n    \'jquery.exists\': [\'jquery\']\n  }\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

单元.js

\n\n
require([\n  \'qunit\',\n  \'test-foo\'\n],\nfunction(qunit, TestFoo) {\n  TestFoo();\n  qunit.start();\n});\n
Run Code Online (Sandbox Code Playgroud)\n\n

测试-foo.js:

\n\n
define([\'jquery\', \'qunit\', \'foo\'], function($, qunit, Foo) {\n  \'use strict\';\n  return function() {\n    qunit.module("Foo");\n    qunit.test("Foo Test", function() {\n      equal(Foo.saySomething(), "Hello", "returns \'Hello\'");\n    });\n  };\n});\n
Run Code Online (Sandbox Code Playgroud)\n\n

最后是我想测试的模块:

\n\n
define([\'jquery\'], function($) {\n  \'use strict\';\n  var Foo = {\n    saySomething: function() {\n      return "Hello";\n    }\n  };\n  return {\n    saySomething: Foo.saySomething\n  };\n});\n
Run Code Online (Sandbox Code Playgroud)\n