首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用Sinon模拟构造函数中的类属性集。

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

Stack Overflow用户
提问于 2019-12-12 11:39:00
回答 1查看 1.4K关注 0票数 0

我试图模拟一个类属性,该属性在构造函数中设置为默认值

代码语言:javascript
运行
复制
class Files {
  constructor(queueNumber = 0) {
    this.queueNumber = queueNumber;
    this.dir = 'JiraResults';
    if (!fs.existsSync(this.dir)) {
      fs.mkdirSync(this.dir);
    }
  }
  ...
}

构造函数基于dir属性创建目录和文件,对于测试,我需要另一个目录,因此不需要移动真正的目录来运行测试。

我尝试了许多方法来替换这些财产,但所有的方法都失败了,与西农的错误不同。

第一次尝试:

代码语言:javascript
运行
复制
const tempDir = 'JiraResults-TEMP';
let stubDir;

describe('Files', () => {
  before(() => {
    stubDir = sinon.stub(Files.prototype.constructor, 'dir').value(tempDir);
  }
  ...
}

通过这个,我得到了错误TypeError: Cannot stub non-existent own property dir

第二次尝试

代码语言:javascript
运行
复制
const tempDir = 'JiraResults-TEMP';
let stubDir;

describe('Files', () => {
  before(() => {
    stubDir = sinon.stub(Files.prototype, 'dir').value(tempDir);
  }
  ...
}

通过这个,我得到了错误TypeError: Cannot stub non-existent own property dir

第三次尝试

代码语言:javascript
运行
复制
const tempDir = 'JiraResults-TEMP';
let stubDir;

describe('Files', () => {
  before(() => {
    stubDir = sinon.stub(Files.prototype, 'this').value({
      dir: sinon.stub().returnsThis(tempDir),
    });
  }
  ...
}

通过这个,我得到了错误TypeError: Cannot stub non-existent own property this

我也尝试过其他的方法,但从未被更换过。

我研究了Sinon文档,但这些示例似乎都不适用于构造函数类。

有人能给我举个例子,说明我如何替换这个财产吗?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-16 03:23:13

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

例如。

files.js

代码语言:javascript
运行
复制
class Files {
  constructor(queueNumber = 0) {
    this.queueNumber = queueNumber;
    this.dir = "JiraResults";
  }

  mkdir() {
    console.log("make dir: ", this.dir);
  }
}

module.exports = Files;

files.test.js

代码语言:javascript
运行
复制
const Files = require("./files");
const sinon = require("sinon");

describe("Files", () => {
  it("should use stubbed dir", () => {
    sinon.spy(console, "log");
    const instance = new Files();
    instance.dir = "stubbed dir";
    instance.mkdir();
    sinon.assert.calledWith(console.log, "make dir: ", "stubbed dir");
  });
});

单元测试结果:

代码语言:javascript
运行
复制
Files
make dir:  stubbed dir
    ✓ should use stubbed dir


  1 passing (7ms)

---------------|----------|----------|----------|----------|-------------------|
File           |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
---------------|----------|----------|----------|----------|-------------------|
All files      |      100 |      100 |      100 |      100 |                   |
 files.js      |      100 |      100 |      100 |      100 |                   |
 files.test.js |      100 |      100 |      100 |      100 |                   |
---------------|----------|----------|----------|----------|-------------------|

更新:

我觉得这不可能。让我们来看看下面的例子:

files.js

代码语言:javascript
运行
复制
const fs = require("fs");

class Files {
  constructor(queueNumber = 0) {
    this.queueNumber = queueNumber;
    console.log("before: ", this.dir);
    this.dir = "JiraResults";
    console.log("after: ", this.dir);
    if (!fs.existsSync(this.dir)) {
      fs.mkdirSync(this.dir);
    }
  }
}

Files.prototype.dir = "";

module.exports = Files;

files.test.js

代码语言:javascript
运行
复制
const Files = require("./files");
const sinon = require("sinon");
const fs = require("fs");

describe("Files", () => {
  it("should use stubbed dir to mkdir", () => {
    sinon.stub(fs, "existsSync").returns(false);
    sinon.stub(fs, "mkdirSync");
    sinon.stub(Files.prototype, "dir").value("stubbed dir");
    console.log("stub dir");
    new Files();
    sinon.assert.calledWith(fs.existsSync, "stubbed dir");
    sinon.assert.calledWith(fs.mkdirSync, "stubbed dir");
  });
});

单元测试结果:

代码语言:javascript
运行
复制
  Files
stub dir
before:  stubbed dir
after:  JiraResults
    1) should use stubbed dir to mkdir


  0 passing (13ms)
  1 failing

  1) Files
       should use stubbed dir to mkdir:
     AssertError: expected existsSync to be called with arguments 
JiraResults stubbed dir 
      at Object.fail (node_modules/sinon/lib/sinon/assert.js:106:21)
      at failAssertion (node_modules/sinon/lib/sinon/assert.js:65:16)
      at Object.assert.(anonymous function) [as calledWith] (node_modules/sinon/lib/sinon/assert.js:91:13)
      at Context.it (src/stackoverflow/59303752/files.test.js:1:2345)

在实例化类dir之前,我们可以成功地为属性Files创建存根。但是在我们实例化了类Files之后。它将将"JiraResults“字符串分配给属性dir,这意味着它将将stubbed dir替换为JiraResults

有三种选择:

requirement.)

  • Pass

  • 为property dirFiles.prototype.dir = 'JiraResults'设置默认值(但它是基于您的dir作为构造器的参数,该构造函数为Files class.
  1. Extract fs操作的一个方法,如原始的anwser. )。

然后,为单元测试制作存根就更容易了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59303752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档