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

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

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

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

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

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

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

第一次尝试:

代码语言:javascript
运行
AI代码解释
复制
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
运行
AI代码解释
复制
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
运行
AI代码解释
复制
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-15 19:23:13

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

例如。

files.js

代码语言:javascript
运行
AI代码解释
复制
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
运行
AI代码解释
复制
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
运行
AI代码解释
复制
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
运行
AI代码解释
复制
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
运行
AI代码解释
复制
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
运行
AI代码解释
复制
  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

复制
相关文章
Rmarkdown与Word文档的交互
在Rmarkdown中提供了直接生成Word文档格式的选项,只要在新建rmarkdown时选择Word选项就行了。
医学和生信笔记
2022/11/15
1.9K0
Rmarkdown与Word文档的交互
Swagger文档转Word 文档
GitHub 地址:https://github.com/JMCuixy/SwaggerToWord/tree/developer 一、前言     为什么会产生这个需求呢?     我们公司作为乙方,老是被客户追着要一份API文档,当我们把一个 Swagger 文档地址丢给客户的时候。客户还是很不满意,嫌不够正式!!死活坚持要一份 word 文档 。然后领导给了个接口模板,就把这个活交给我了......我去,近10个微服务,几百个接口,这不得要了我的命啊(最后整理出来将近200页的 word 文档)。最后
JMCui
2018/03/16
9K0
Swagger文档转Word 文档
HTML5 download属性无效的问题
如果url指向第三方资源,download会失效,表现和不使用download时一致——浏览器能打开的文件,浏览器会直接打开,不能打开的文件,会直接下载。浏览器打开的文件,可以手动下载。
javascript.shop
2019/09/04
5K0
Python创建分栏排版的Word文档
功能描述: 创建docx格式的Word文档,设置分栏数不同的多个节,并在每个节中写入文本。 参考代码: 运行结果:
Python小屋屋主
2020/04/01
2K0
MySQL生成word文档
链接:https://pan.baidu.com/s/16tkYaO7l42XNxUPmQi5deQ 提取码:i6mq
HaC
2020/12/30
4.2K1
MySQL生成word文档
获取pdf文档属性的方法
 当我们想在打开pdf文件之前对pdf状态进行判断时,我们可以在pdf文档属性里添加自己需要的信息,例如把pdf的有效时间和开始时间以json格式保存在作者信息里,这样就方便得多了。因此我们需要这样的第三方的类库,对pdf文档信息进行读写,在这里我推荐pdfbox和pdfclown,这两个都是java处理pdf的类库,而且开源。下面主要介绍pdfclown,而pdfbox做法差不多。        首先,我们在官网上下载pdfclown的源代码http://www.stefanochizzolini.it/
forrestlin
2018/05/23
2.1K0
新建 Microsoft Word 文档
正如我们在第4章中所了解到的,大多数组织都会提供一个可访问Internet(或Intranet,如果在防火墙后面进行测试)的网站,以向匿名用户推销组织能力、联系信息等。这些类型Web服务的一种常见部署方法是托管在非军事区(DMZ)中,非军事区是一个逻辑上或物理上独立的子网,用于公开组织面向公众的外部服务。
顾翔
2022/09/23
7K0
新建 Microsoft Word 文档
java生成word文档
定义一个工具类wordUtil: package com.keji.service.utils; import org.apache.poi.xwpf.usermodel.*; import java.io.FileInputStream; import java.io.InputStream; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.regex.Matcher; i
FHAdmin
2022/01/04
1.6K0
Android为属性组件动画无效
本来我的代码是这样的 然后发现这动画只能在窗体onCreate的时候使用有效。 放在点击事件之类的就不行了。 后经百度发现需要开始动画而不是设置动画 carImg.startAnimation(animation);
SingYi
2022/07/13
8020
Android为属性组件动画无效
python读取word文档表格里的数据
首先需要安装相应的支持库: 直接在命令行执行pip install python-docx
py3study
2020/01/03
3.8K1
text-align属性对position:absloute/fixed的元素无效
text-align属性对position:absloute/fixed的元素无效
javascript.shop
2019/09/04
1.9K0
text-align属性对position:absloute/fixed的元素无效
android:imeOptions属性详解以及无效处理
软键盘的Enter键默认显示的是“完成”文本,我们知道按Enter建表示前置工作已经准备完毕了,要去什么什么啦。比如,在一个搜索中,我们输入要搜索的文本,然后按Enter表示要去搜索了,但是默认的Enter键显示的是“完成”文本,看着不太合适,不符合搜索的语义,如果能显示“搜索”两个字或者显示一个表示搜索的图标多好。事实证明我们的想法是合理的,Android也为我们提供的这样的功能。通过设置android:imeOptions来改变默认的“完成”文本。这里举几个常用的常量值:
再见孙悟空_
2023/02/10
2.5K0
android:imeOptions属性详解以及无效处理
java解析word文档内容
今日主题:java解析word文档内容 1依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.16</version> </dependency> <dependency> <groupId>org.apache.poi</groupId>
java后端指南
2021/07/20
2.2K0
使用Python处理Word文档
1. 前言2. 使用Document对象创建文档3. 在word文档中使用标题4. 在word文档中使用段落5. 在word文档中使用列表6. 在word文档中使用表格7. 在word文档中使用章节8. 在word文档中使用分页9. 在word文档中使用图片10. 读取word文档中的内容
LogicPanda
2019/09/03
7.4K0
Java POI Word 写文档
本文通过介绍Apache POI,讲解如何使用Java代码操作Microsoft Word文档。
I Teach You 我教你
2018/01/02
2.4K0
使用 Python 操作 word文档
最近手头有一个需求是对word文档内容进行判断,搜索到一个包感觉不错,简单记录一下关键操作:
生信菜鸟团
2020/07/21
1.8K0
Word VBA技术:设置文档中表格的格式
在编辑Word文档时,经常会使用表格,也会设置表格格式,让表格看起来更美观。那么,在VBA中如何操作表格来设置其格式呢?下面介绍两段简单的代码,来学习使用代码初步设置表格的格式。
fanjy
2023/02/24
1.4K0
点击加载更多

相似问题

使用AddPicture方法word调整图像属性

11

Word表中的Shapes.AddPicture

211

编辑Word文档的属性

12

修改Word文档属性

34

追加不同的word文档,保持每个文档的属性

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文