NPM 包如何依赖于另一个包中的测试但注入其自己的导出以进行测试?
How can a NPM Package depends on tests in another package but injects its own exports to be tested?
好的,我不确定这是否可行,但是,
假设我是整个世界的中央天气监测器。
我需要能够呼叫每个国家/地区的天气 API 以获取温度、风和雨量等信息。
所有国家聚在一起并同意这些包将输出相同的功能。
因此每个国家/地区都构建了一个 NPM 包,其中包含:
exports.currentTemp() { return <current temperature>;}
exports.currentWind() { return <current wind speed>;}
exports.currentRain() { return <current rain fall>;}
中央天气监控已经创建了一个名为 weather-api-test 的测试套件,它 运行 进行了一些测试。
每个国家都有责任在推送代码之前确保代码通过测试。
每个国家如何依赖 weather-api-test 包和 运行 那里的测试?
我想问这个问题的一个简短方法是,我如何动态添加 require('uk-weather-api');进入摩卡测试?
有一个名为 rewire 的库可以让您在这里做您想做的事。
它本质上允许您覆盖其他脚本中的局部变量。
https://github.com/jhnns/rewire
例如:
如果您的共享测试(我们称之为 theirTest)需要这样的脚本:
var foo = require( "theirScript" );
您可以像这样在自己的测试中使用 rewire:
var rewire = require("rewire");
var theirTest = rewire( "./theirTest" ); // Note that I used rewire here and not require
var bar = require("./myScript"); // The script you want to inject into their tests
theirTest.__set__("foo", bar); //__set__ is a rewire injected function allowing you to access foo
你最终得到的是你自己的新测试脚本,它只是将你的脚本注入到他们的测试中。在这种情况下,您 运行 他们针对您的脚本进行测试。
你可以让你的测试套件加载一个名为 ./impl
的模块,想要 运行 你的套件反对他们的实现的人会创建这个模块,以便加载他们的特定实现并使其可供你使用测试套件。套房可能是这样的:
var assert = require("assert");
var impl;
try {
impl = require("./impl");
}
catch (e) {
if (e instanceof Error && e.code === "MODULE_NOT_FOUND")
throw new Error("You must create a module that loads as `./impl` in" +
"in the test suite so that the suite can load your " +
"implementation of the API.");
// Just rethrow anything else...
throw e;
}
it("works", function () {
assert(impl.getId() !== undefined);
});
假设我在 a.js
中有一个实现:
exports.getId = function () {
return module.id;
};
我可以像这样创建一个 impl.js
文件来加载我的实现:
module.exports = require("./a");
好的,我不确定这是否可行,但是, 假设我是整个世界的中央天气监测器。 我需要能够呼叫每个国家/地区的天气 API 以获取温度、风和雨量等信息。 所有国家聚在一起并同意这些包将输出相同的功能。 因此每个国家/地区都构建了一个 NPM 包,其中包含:
exports.currentTemp() { return <current temperature>;}
exports.currentWind() { return <current wind speed>;}
exports.currentRain() { return <current rain fall>;}
中央天气监控已经创建了一个名为 weather-api-test 的测试套件,它 运行 进行了一些测试。 每个国家都有责任在推送代码之前确保代码通过测试。 每个国家如何依赖 weather-api-test 包和 运行 那里的测试? 我想问这个问题的一个简短方法是,我如何动态添加 require('uk-weather-api');进入摩卡测试?
有一个名为 rewire 的库可以让您在这里做您想做的事。 它本质上允许您覆盖其他脚本中的局部变量。
https://github.com/jhnns/rewire
例如: 如果您的共享测试(我们称之为 theirTest)需要这样的脚本:
var foo = require( "theirScript" );
您可以像这样在自己的测试中使用 rewire:
var rewire = require("rewire");
var theirTest = rewire( "./theirTest" ); // Note that I used rewire here and not require
var bar = require("./myScript"); // The script you want to inject into their tests
theirTest.__set__("foo", bar); //__set__ is a rewire injected function allowing you to access foo
你最终得到的是你自己的新测试脚本,它只是将你的脚本注入到他们的测试中。在这种情况下,您 运行 他们针对您的脚本进行测试。
你可以让你的测试套件加载一个名为 ./impl
的模块,想要 运行 你的套件反对他们的实现的人会创建这个模块,以便加载他们的特定实现并使其可供你使用测试套件。套房可能是这样的:
var assert = require("assert");
var impl;
try {
impl = require("./impl");
}
catch (e) {
if (e instanceof Error && e.code === "MODULE_NOT_FOUND")
throw new Error("You must create a module that loads as `./impl` in" +
"in the test suite so that the suite can load your " +
"implementation of the API.");
// Just rethrow anything else...
throw e;
}
it("works", function () {
assert(impl.getId() !== undefined);
});
假设我在 a.js
中有一个实现:
exports.getId = function () {
return module.id;
};
我可以像这样创建一个 impl.js
文件来加载我的实现:
module.exports = require("./a");