Node.js mockry mocking os.type()不起作用
我正在尝试对依赖于底层操作系统的模块进行单元测试 我正在尝试使用mockry来mock os.type()来返回基于不同测试装置的Linux/Windows\n 我使用mocha作为我的单元测试框架 我有一个描述部分,单元测试模块的功能,其中有两个描述块:一个用于Windows,一个用于Linux 设置: var重新加载=要求(“要求重新加载”)(要求); var模块_we_test=重新加载(“…”) 我要求在每个OS相关测试夹具之前测试模块的原因是,该模块在全局范围内使用OS模块一次,以确定一些变量值,如:Node.js mockry mocking os.type()不起作用,node.js,unit-testing,mocking,mocha.js,mockery,Node.js,Unit Testing,Mocking,Mocha.js,Mockery,我正在尝试对依赖于底层操作系统的模块进行单元测试 我正在尝试使用mockry来mock os.type()来返回基于不同测试装置的Linux/Windows\n 我使用mocha作为我的单元测试框架 我有一个描述部分,单元测试模块的功能,其中有两个描述块:一个用于Windows,一个用于Linux 设置: var重新加载=要求(“要求重新加载”)(要求); var模块_we_test=重新加载(“…”) 我要求在每个OS相关测试夹具之前测试模块的原因是,该模块在全局范围内使用OS模块一次,以确定
var os = require('os');
var osType = os.type();
/* decide variable values based on os.type() return value */
因此,我认为,除非我再次需要它,否则在每个装置之前,它将加载最初加载的OS模块,而不是我的模拟
现在,问题是它没有替换模块中的操作系统模块,我不知道为什么。发生这种情况是因为在上面你做了
var-module\u-we\u-test=require(“…”)代码>。这将加载原始模块并将其保留在缓存中。因此,即使在每次需要时都使用mockry对其进行模拟,也会得到缓存的原始模块。您需要先使用mockry来模拟模块,然后重新加载
被测模块。重新加载的模块现在将检索模拟模块。您可以使用[require reload][1]模块完成此操作
工作示例
describe('#the_module_we_test', function() {
before(function() {
mockery.enable({
warnOnReplace: false
});
});
after(function() {
mockery.disable();
});
describe('#windows', function() {
var module_we_test;
before(function() {
mockery.registerMock("os", windowsOsMock);
module_we_test = reload("...");
});
after(function(){
mockery.deregisterMock(windowsOsMock);
});
it("#functionality A", function() {
/* tests functionality A which is OS dependnet */
assert.equal(module_we_test.type(), "Windows_NT");
});
});
describe('#linux', function() {
var module_we_test;
before(function() {
mockery.registerMock("os", linuxOsMock);
module_we_test = reload("...");
});
after(function(){
mockery.deregisterMock(linuxOsMock);
});
it("#functionality A", function() {
/* tests functionality A which is OS dependnet */
assert.equal(module_we_test.type(), "Linux");
});
});
});
更新
describe('#the_module_we_test', function() {
before(function() {
mockery.enable({
warnOnReplace: false
});
});
after(function() {
mockery.disable();
});
describe('#windows', function() {
var module_we_test;
before(function() {
mockery.registerMock("os", windowsOsMock);
module_we_test = reload("...");
});
after(function(){
mockery.deregisterMock(windowsOsMock);
});
it("#functionality A", function() {
/* tests functionality A which is OS dependnet */
assert.equal(module_we_test.type(), "Windows_NT");
});
});
describe('#linux', function() {
var module_we_test;
before(function() {
mockery.registerMock("os", linuxOsMock);
module_we_test = reload("...");
});
after(function(){
mockery.deregisterMock(linuxOsMock);
});
it("#functionality A", function() {
/* tests functionality A which is OS dependnet */
assert.equal(module_we_test.type(), "Linux");
});
});
});
在更彻底地阅读了mockry
的文档之后,它似乎提供了干净的缓存功能。因此,您只需设置
before(function() {
mockery.enable({
warnOnReplace: false,
useCleanCache: true
});
});
而通常需要加载模拟模块的模块。在os
的after
钩子中,描述您需要调用mockry.resetCache
after(function(){
mockery.deregisterMock(windowsOsMock);
mockery.resetCache();
});
我相信这是使用mockry
模块解决这种情况的最佳方法除了测试中的模块之外,您是否在其他模块中加载os
模块?我已经按照u的建议使用了重新加载,并在与特定os相关的每个测试夹具之前重新加载它,然而,当我调试Linux设备时,我仍然将Windows作为我的osType,我将更新op@Jorayen别忘了在descripe块中注销你的mock。仍然不工作,我不知道我第一次使用mocky时做错了什么,如果你能给我写一份工作报告会很有帮助的template@Jorayen我添加了一个在我的机器上运行的工作示例。希望有帮助。此外,无需在文件顶部重新加载模块\u we\u test
。看看我在我的例子里做了什么!似乎需要在文件顶部进行模块测试,而不仅仅是在fixture范围内使用模块测试,导致了问题。