2014-10-08 100 views
2

我正在尝试使用实验室测试框架来自动化测试使用node.js和StrongLoop实现的简单REST API。 StrongLoop提供了一个我用来验证REST API已经实现的浏览器网页,我可以从Postman手动测试API。如何从intern.js测试中加载node.js http模块?

我尝试使用intern.js的第一个API测试检索集合中媒体对象的计数。 HTTP方法是GET,URL是http://localhost:3000/api/media/count,响应是{“count”:2}。

当我运行我的intern.js测试时收到错误“错误:尝试要求卸载的模块http”。

我在我的node.js应用程序中有一个\ tests子目录。我的测试用例是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'); 
     } 
    }); 
}); 

我intern.js配置文件是:

// 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)\// 
}); 

我使用命令`C运行测试:\库\应用>实习生-客户端配置=测试/实习生”和下面控制台输出产生:

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 | 
---------------|-----------|-----------|-----------|-----------| 

我理解的是在HTTP模块与node.js的自动安装的芯模块,但是不知intern.js,虽然基于节点,不p无需额外配置就可以访问核心模块。这个合理的,但我已经看过intern.js教程和intern.js配置指南,但还没有找到一种方法来添加引用或依赖项,使测试案例能够成功加载node.js http模块。我是intern.js的新手,所以希望我没有正确配置它或测试。

我欢迎任何意见/见解我做错了什么。

最好的问候,

兆瓦

+0

一个额外的说明:对于这个第一步,我试图测试没有任何UI客户端组件的REST API,所以我正在寻找一个不依赖于浏览器或浏览器仿真的解决方案。这就是为什么我想使用node.js HTTP模块。 – mw1967 2014-10-08 21:55:04

回答

9

实习生运行其测试在AMD的环境,所以require是AMD装载机require,没有节点的,因此你的错误。

要加载节点模块,使用AMD intern/dojo/node!插件,它们包括在模块的依赖关系,例如:

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

这是实习生的用户指南中Testing CommonJS Modules下记录。

+1

可能要注意的是:这不仅适用于标准节点模块,而且可以使用“http”,但也适用于任何npm模块。 – Kiechlus 2016-03-15 13:39:26