Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js mockry mocking os.type()不起作用_Node.js_Unit Testing_Mocking_Mocha.js_Mockery - Fatal编程技术网

Node.js mockry mocking os.type()不起作用

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模块一次,以确定

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

我正在尝试使用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范围内使用模块测试,导致了问题。