Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/401.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
Javascript 使用Sinon模拟构造函数中的类属性集_Javascript_Unit Testing_Mocha.js_Sinon_Es6 Class - Fatal编程技术网

Javascript 使用Sinon模拟构造函数中的类属性集

Javascript 使用Sinon模拟构造函数中的类属性集,javascript,unit-testing,mocha.js,sinon,es6-class,Javascript,Unit Testing,Mocha.js,Sinon,Es6 Class,我试图模拟构造函数中设置为默认值的类属性 class Files { constructor(queueNumber = 0) { this.queueNumber = queueNumber; this.dir = 'JiraResults'; if (!fs.existsSync(this.dir)) { fs.mkdirSync(this.dir); } } ... } 构造函数基于dir属性创建目录和文件,对于测试,我需要另一个目

我试图模拟构造函数中设置为默认值的类属性

class Files {
  constructor(queueNumber = 0) {
    this.queueNumber = queueNumber;
    this.dir = 'JiraResults';
    if (!fs.existsSync(this.dir)) {
      fs.mkdirSync(this.dir);
    }
  }
  ...
}
构造函数基于
dir
属性创建目录和文件,对于测试,我需要另一个目录,因此不需要移动实际目录来运行测试

我尝试了许多方法来替换该属性,但所有这些方法都因Sinon的不同错误而不断失败

第一次尝试: 这样我就得到了错误
TypeError:cannotstub不存在的自有属性dir

第二次尝试 这样我就得到了错误
TypeError:cannotstub不存在的自有属性dir

第三次尝试 这样我就得到了错误
TypeError:cannotstub不存在自己的属性this


我也尝试过其他的东西,但从来没有达到让人更换房子的地步

我查阅了Sinon文档,但没有一个示例适用于构造函数类

有谁能给我一个关于如何替换此属性的工作示例吗


谢谢。

您可以直接更改
dir
属性的值,以便测试中的方法将使用存根
dir

例如

files.js

类文件{
构造函数(queueNumber=0){
this.queueNumber=queueNumber;
this.dir=“JiraResults”;
}
mkdir(){
log(“make dir:”,this.dir);
}
}
module.exports=文件;
files.test.js

const Files=require(“./文件”);
const sinon=要求(“sinon”);
描述(“文件”,()=>{
它(“应该使用存根目录”,()=>{
sinon.spy(控制台,“日志”);
const instance=新文件();
instance.dir=“stubbed dir”;
mkdir();
assert.calledWith(console.log,“make dir:”,“stubbed dir”);
});
});
单元测试结果:

文件
make dir:stubbed dir
✓ 应该使用存根目录
1次通过(7毫秒)
---------------|----------|----------|----------|----------|-------------------|
文件|%Stmts |%Branch |%Funcs |%Line |未覆盖行|s|
---------------|----------|----------|----------|----------|-------------------|
所有文件| 100 | 100 | 100 | 100 ||
files.js | 100 | 100 | 100 | 100 ||
files.test.js | 100 | 100 | 100 | 100 ||
---------------|----------|----------|----------|----------|-------------------|
更新:

我认为这是不可能的。让我们来看看下面的例子:

files.js

const fs=require(“fs”);
类文件{
构造函数(queueNumber=0){
this.queueNumber=queueNumber;
log(“before:”,this.dir);
this.dir=“JiraResults”;
log(“之后:”,this.dir);
如果(!fs.existsSync(this.dir)){
fs.mkdirSync(this.dir);
}
}
}
Files.prototype.dir=“”;
module.exports=文件;
files.test.js

const Files=require(“./文件”);
const sinon=要求(“sinon”);
常数fs=要求(“fs”);
描述(“文件”,()=>{
它(“应该使用存根目录到mkdir”,()=>{
sinon.stub(fs,“existsSync”)。返回(假);
sinon.存根(fs,“mkdirSync”);
sinon.stub(Files.prototype,“dir”).value(“stubbed dir”);
console.log(“存根目录”);
新文件();
sinon.assert.calledWith(fs.existsSync,“stubbed dir”);
sinon.assert.calledWith(fs.mkdirSync,“存根目录”);
});
});
单元测试结果:

文件
存根目录
之前:存根目录
之后:JiraResults
1) 应该使用stubbed dir到mkdir
0通过(13毫秒)
1失败
1) 档案
应使用stubbed dir到mkdir:
AssertError:应使用参数调用existsSync
JiraResults stubbed dir
at Object.fail(node_modules/sinon/lib/sinon/assert.js:106:21)
在failAssertion(node_modules/sinon/lib/sinon/assert.js:65:16)
at Object.assert.(匿名函数)[as calledWith](node_modules/sinon/lib/sinon/assert.js:91:13)
位于Context.it(src/stackoverflow/59303752/files.test.js:1:2345)
在实例化类
文件之前,我们可以成功地为属性
dir
创建存根。但是在我们实例化类
文件之后。它将“JiraResults”字符串分配给属性
dir
,这意味着它将把
存根目录
替换为
JiraResults

有三种选择:

  • 为属性
    dir
    Files.prototype.dir='JiraResults'
    设置默认值(但这取决于您的要求。)
  • dir
    作为参数传递给
    文件
    类的构造函数
  • fs
    操作提取到类似原始anwser的方法中

  • 然后,为单元测试创建存根会更容易。

    我考虑过这种方法,但我遇到的问题是构造函数创建了文件夹。因此,在构造函数运行后更改属性不是一个选项。我更新了问题以显示这一点。不管怎样,谢谢你。有道理。。。我将更改构造函数,使其具有默认值,但允许替换我的测试。谢谢
    const tempDir = 'JiraResults-TEMP';
    let stubDir;
    
    describe('Files', () => {
      before(() => {
        stubDir = sinon.stub(Files.prototype.constructor, 'dir').value(tempDir);
      }
      ...
    }
    
    const tempDir = 'JiraResults-TEMP';
    let stubDir;
    
    describe('Files', () => {
      before(() => {
        stubDir = sinon.stub(Files.prototype, 'dir').value(tempDir);
      }
      ...
    }
    
    const tempDir = 'JiraResults-TEMP';
    let stubDir;
    
    describe('Files', () => {
      before(() => {
        stubDir = sinon.stub(Files.prototype, 'this').value({
          dir: sinon.stub().returnsThis(tempDir),
        });
      }
      ...
    }