javascript - 在 stub 函数之后它仍然调用真正的函数

标签 javascript unit-testing mocha.js

我已经 stub 了文件的内容,因此我只能运行外部函数

文件.html

<body onload ="test('file.txt')">
<body>

file.js

    const fs1 = require('fs');
    let param;
    module.export = {
         test,
         test1,
         param
    }

    function test (outputParam) {
      let fileData = test1(outputParam);
      param = fileData;
    }

    function test1(outputParam) {
       let data = fs1.readFileSync(outputParam);
       return data; 
    }

正如您所见,我从 html onload 加载函数测试,然后 test1 调用并读取文件,我已 stub 此文件内容,如下面的测试所示

当我运行测试时,我想查看变量 param 具有文件内容值

test.spec.js

    let sinon = require("sinon");
    let filejs = require('./file.js');

    it('should run only the outer function' ,function() {

    // I try to stub my function here
    sinon.stub(filejs,'test1').callsFake ((someArg) => {
      return "this is my file content";
    });

        // Now I will call my test function
        filejs.test(someArg);

    })

正如您在上面看到的,我已经 stub 了函数 test1,但是当我运行测试时,我看到 test1 被调用并且它读取真实的文件。

我正在使用 mocha ,我对 stub 或模拟概念很陌生,非常感谢任何建议。

最佳答案

您可能应该尝试 stub readFileSync

const fs = require('fs');

// ...

sinon.stub(fs, "readFileSync").callsFake ((someArg) => {
  return "this is my file content";
});

除此之外,我还可以发现您的代码存在两个问题。

  • real readFileSync 将返回 Buffer如果调用时没有第二个参数,则不是像 stub 那样的字符串。

  • body onload 事件仅存在于 DOM 内部。 fs 模块仅在 Node.js 中可用。如果您在浏览器中运行代码,您将无法使用 fs.readFileSync。如果您在 Node 中运行它,您的 HTML 文件和 onload 事件将没有用处。

关于javascript - 在 stub 函数之后它仍然调用真正的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60297654/

相关文章:

javascript - 即 : Undocumented "cache" attribute defined for input elements?

javascript - 在 Mocha 上循环()

java - JMockit:测试覆盖抽象方法的方法

java - JUnit 测试 - 将 void 类型方法的标准输出输出与 String 进行比较

javascript - 隔离一个测试套件所需的 js 文件

ruby-on-rails - 使用 rspec 确保记录器被调用

javascript - React 函数式组件(不再使用类组件)内部的箭头函数和常规函数有什么区别?

javascript - 一个单元格中的双选菜单 JqGrid

javascript - 如何导入一个js文件并在 Angular 库中使用它(不是在项目中)

angular - 模拟单元测试的 <ng-template> - Angular 2