Javascript 在stubing函数之后,它仍然调用实函数

Javascript 在stubing函数之后,它仍然调用实函数,javascript,unit-testing,mocha.js,Javascript,Unit Testing,Mocha.js,我已经对文件的内容进行了存根,所以我只能运行外部函数 file.html <body onload ="test('file.txt')"> <body> 正如您看到的,我从HTMLonLoad加载函数测试,然后test1调用并读取文件,我已经截取了这个文件的内容,如下面的测试所示 运行测试时,我希望看到变量param具有文件内容值 测试规范js let sinon = require("sinon"); let filejs = require('./

我已经对文件的内容进行了存根,所以我只能运行外部函数

file.html

<body onload ="test('file.txt')">
<body>
正如您看到的,我从HTMLonLoad加载函数测试,然后test1调用并读取文件,我已经截取了这个文件的内容,如下面的测试所示

运行测试时,我希望看到变量param具有文件内容值

测试规范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);

    })
正如您在上面所看到的,我使用了stubbed函数test1,但是当我运行测试时,我看到test1被调用,它读取真实的文件


我正在使用mocha,我不熟悉存根或模拟概念,任何建议都非常感谢。

您可能应该尝试存根
readFileSync

const fs = require('fs');

// ...

sinon.stub(fs, "readFileSync").callsFake ((someArg) => {
  return "this is my file content";
});
除此之外,我可以发现您的代码存在两个问题

  • real
    readFileSync
    在调用时将返回一个if,而不使用第二个参数,而不是像存根那样的字符串


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


如果您不理解我的问题,请告诉我。
sinon.stub()
只能影响导出对象的属性,但是
test()
函数直接调用内部函数
test1()
sinon.stub()
无法处理模块的内部结构。如果在节点中运行它,则HTML文件和onload事件将不会有用。您的意思是我应该将其作为node file.js运行。如果您正在为node编写应用程序,那么是的。如果你的应用程序是浏览器,还有其他方法来阅读我想的文件。你好,你有什么建议吗?
const fs = require('fs');

// ...

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