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),
});
}
...
}