gpt4 book ai didi

node.js - mock os.type() 不起作用

转载 作者:太空宇宙 更新时间:2023-11-03 22:13:06 25 4
gpt4 key购买 nike

我正在尝试对我的一个依赖于底层操作系统的模块进行单元测试。

我正在尝试使用模拟来模拟 os.type() 以根据不同的测试装置返回 Linux/Windows_NT。

我使用 mocha 作为我的单元测试框架。

我有一个描述部分,用于对模块的功能 A 进行单元测试,其中有 2 个描述 block :一个用于 Windows,一个用于 Linux。

设置: var reload = require("require-reload")(require); var module_we_test = 重新加载('...');

var linuxOsMock = {
type: function () {
return "Linux";
}
};

var windowsOsMock = {
type: function () {
return "Windows_NT";
}
};


describe('#the_module_we_test', function() {
before(function() {
mockery.enable({
warnOnReplace: false
});
});
after(function() {
mockery.disable();
});
describe('#windows', function() {
before(function() {
mockery.registerMock('os', windowsOsMock);
module_we_test = reload('...');
});
describe('#functionality A', function() {
it('...', function() {
/* tests functionality A which is OS dependnet */
module_we_test.functionalityA();
});
});
describe('#linux & darwin', function() {
before(function() {
mockery.registerMock('os', linuxOsMock);
module_we_test = reload('...');
});
describe('#functionality A', function() {
it('...', function() {
/* tests functionality A which is OS dependnet */
module_we_test.functionalityA();
});
});
});
});

我需要在每个依赖于操作系统的测试装置之前测试模块的原因是因为该模块在全局范围内使用操作系统模块一次来决定一些变量值,如下所示:

var os = require('os');
var osType = os.type();

/* decide variable values based on os.type() return value */

所以,我认为除非我再次需要它,否则在每个固定装置之前它将加载最初加载的操作系统模块而不是我的模拟。

现在的问题是,它只是没有替换模块中的操作系统模块,我不知道为什么。

最佳答案

发生这种情况是因为您在顶部执行了 var module_we_test = require('...');。这将加载原始模块并将其保存在缓存中。因此,即使您每次需要时都使用 mock 来模拟它,您也会取回缓存的原始模块。您需要首先使用模拟来模拟模块,然后重新加载被测试的模块。重新加载的模块现在将检索模拟的模块。您可以使用 [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");
});
});
});

更新

在更彻底地阅读了mockery的文档后,它似乎提供了清理缓存功能。因此,您只需设置

,而不是使用 require-reload
before(function() {
mockery.enable({
warnOnReplace: false,
useCleanCache: true
});
});

require 通常是加载模拟模块的模块。在 os 描述的 after 钩子(Hook)中,您需要调用 mockery.resetCache

after(function(){
mockery.deregisterMock(windowsOsMock);
mockery.resetCache();
});

我相信这是使用 mockery 模块解决这种情况的最佳方法

关于node.js - mock os.type() 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36663999/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com