How to load node.js http module from intern.js test?

I am trying to use Intern testing framework to automate testing of a simple REST API implemented with node.js and StrongLoop. StrongLoop provides an explorer web page that I used to verify that the REST API is implemented and I can manually test the API from Postman.

The first API test I try with intern.js returns the number of media objects in the collection. The HTTP method is GET, a URL http://localhost:3000/api/media/count

, and the response is {"count": 2}.

When I run my intern.js test, I get the error "Error: Attempting to request to unload the http module".

I have a \ tests subdirectory in my node.js application. My test case: media.js:

define([
    'intern!object',
    'intern/chai!assert'
], function (registerSuite, assert, media) {
    registerSuite({
        name: 'media',
        count: function() {
        var http = require("http");
        var request = http.request;
        request({
          url: "http://localhost:3000/api/media/count",
          method: "GET"
        }, function (error, response, body) {
          console.log("Status", response.statusCode);
          console.log("Headers", JSON.stringify(response.headers));
          console.log("Response received", body);
        });

        assert.strictEqual(body, '{"count": 2}',
            url + ' should return 2 items');
        }
    });
});

      

My intern.js config file:

// Learn more about configuring this file at <https://github.com/theintern/intern/wiki/Configuring-Intern>.
// These default settings work OK for most people. The options that *must* be changed below are the
// packages, suites, excludeInstrumentation, and (if you want functional tests) functionalSuites.
define({
    // The port on which the instrumenting proxy will listen
    proxyPort: 9000,

    // A fully qualified URL to the Intern proxy
    proxyUrl: 'http://localhost:9000/',

    // Default desired capabilities for all environments. Individual capabilities can be overridden by any of the
    // specified browser environments in the `environments` array below as well. See
    // https://code.google.com/p/selenium/wiki/DesiredCapabilities for standard Selenium capabilities and
    // https://saucelabs.com/docs/additional-config#desired-capabilities for Sauce Labs capabilities.
    // Note that the `build` capability will be filled in with the current commit ID from the Travis CI environment
    // automatically
    capabilities: {
        'selenium-version': '2.41.0'
    },

    // Browsers to run integration testing against. Note that version numbers must be strings if used with Sauce
    // OnDemand. Options that will be permutated are browserName, version, platform, and platformVersion; any other
    // capabilities options specified for an environment will be copied as-is
    environments: [
        { browserName: 'internet explorer', version: '11', platform: 'Windows 8.1' },
        { browserName: 'internet explorer', version: '10', platform: 'Windows 8' },
        { browserName: 'internet explorer', version: '9', platform: 'Windows 7' },
        { browserName: 'firefox', version: '28', platform: [ 'OS X 10.9', 'Windows 7', 'Linux' ] },
        { browserName: 'chrome', version: '34', platform: [ 'OS X 10.9', 'Windows 7', 'Linux' ] },
        { browserName: 'safari', version: '6', platform: 'OS X 10.8' },
        { browserName: 'safari', version: '7', platform: 'OS X 10.9' }
    ],

    // Maximum number of simultaneous integration tests that should be executed on the remote WebDriver service
    maxConcurrency: 3,

    // Name of the tunnel class to use for WebDriver tests
    tunnel: 'SauceLabsTunnel',

    // The desired AMD loader to use when running unit tests (client.html/client.js). Omit to use the default Dojo
    // loader
    useLoader: {
        'host-node': 'dojo/dojo',
        'host-browser': 'node_modules/dojo/dojo.js'
    },

    // Configuration options for the module loader; any AMD configuration options supported by the specified AMD loader
    // can be used here
    loader: {
        // Packages that should be registered with the loader in each testing environment
        packages: [ 
        { name: 'app', location: '.' },
        ]
    },

    // Non-functional test suite(s) to run in each browser
    suites: [ 'tests/media' /* 'myPackage/tests/foo', 'myPackage/tests/bar' */ ],

    // Functional test suite(s) to run in each browser once non-functional tests are completed
    functionalSuites: [ /* 'myPackage/tests/functional' */ ],

    // A regular expression matching URLs to files that should not be included in code coverage analysis
    excludeInstrumentation: /^(?:tests|node_modules)\//
});

      

I run the test using the command `c: \ Repositories \ app> intern-client config = tests / intern 'and the following console output is given:

c:\Repositories\app>intern-client config=tests/intern
FAIL: main - media - count (0ms)
Error: Attempt to require unloaded module http.request
  at contextRequire  <D:\Users\username\AppData\Roaming\npm\node_modules\inte
rn\node_modules\dojo\dojo.js:255:12>
  at req  <D:\Users\username\AppData\Roaming\npm\node_modules\intern\node_mod
ules\dojo\dojo.js:30:10>
  at Test.registerSuite.count [as test]  <tests\media.js:23:27>
  at Test.run  <D:\Users\username\AppData\Roaming\npm\node_modules\intern\lib
\Test.js:169:19>
  at <D:\Users\username\AppData\Roaming\npm\node_modules\intern\lib\Suite.js:
237:13>
  at signalListener  <D:\Users\username\AppData\Roaming\npm\node_modules\inte
rn\node_modules\dojo\Deferred.js:37:21>
  at Promise.then.promise.then  <D:\Users\username\AppData\Roaming\npm\node_m
odules\intern\node_modules\dojo\Deferred.js:258:5>
  at runTest  <D:\Users\username\AppData\Roaming\npm\node_modules\intern\lib\
Suite.js:236:46>
  at <D:\Users\username\AppData\Roaming\npm\node_modules\intern\lib\Suite.js:
249:7>
  at process._tickCallback  <node.js:419:13>
1/1 tests failed
1/1 tests failed

---------------|-----------|-----------|-----------|-----------|
File           |   % Stmts |% Branches |   % Funcs |   % Lines |
---------------|-----------|-----------|-----------|-----------|
   tests\      |     33.33 |       100 |     66.67 |     33.33 |
      media.js |     33.33 |       100 |     66.67 |     33.33 |
---------------|-----------|-----------|-----------|-----------|
All files      |     33.33 |       100 |     66.67 |     33.33 |
---------------|-----------|-----------|-----------|-----------|

      

I understand that the http module is the main module automatically installed with node.js, however I am wondering if intern.js, although node does, does not support access to the main modules without additional configuration. This seam is sensible, however I have looked at the intern.js tutorial and intern.js setup guide but have not found a way to add a link or dependency so the test case can load the node.js http module successfully. I'm new to intern.js, so expect that I haven't configured it or test correctly.

I welcome any input / understanding of what I am doing wrong.

Regards,

MW

+2


source to share


1 answer


Intern runs its tests in AMD environment, so require

it is AMD bootloader require

, not Node, hence your mistake.

To load Node modules use intern/dojo/node!

AMD plugin and enable them depending on your module, for example:



define([
    ...,
    'intern/dojo/node!http'
], function (..., http) {
    // Now http contains the exports of Node http module
});

      

This is covered in the Intern User Guide under Testing CommonJS Modules .

+9


source







All Articles