Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.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.js的存根ES6类_Javascript_Node.js_Unit Testing_Sinon - Fatal编程技术网

Javascript 带有sinon.js的存根ES6类

Javascript 带有sinon.js的存根ES6类,javascript,node.js,unit-testing,sinon,Javascript,Node.js,Unit Testing,Sinon,我有一个控制器类,它实例化了一个模型类,我想测试控制器在实例化模型时是否使用了正确的参数。我发现在一个带有sinon的类上存根方法没有问题,但是如果我需要存根构造函数,我就无法让它工作 这是我的控制器: import settings from '../../config/settings'; import model from '../models/Form'; let content; export default class Form { constructor (app) {

我有一个控制器类,它实例化了一个模型类,我想测试控制器在实例化模型时是否使用了正确的参数。我发现在一个带有sinon的类上存根方法没有问题,但是如果我需要存根构造函数,我就无法让它工作

这是我的控制器:

import settings from '../../config/settings';
import model from '../models/Form';

let content;

export default class Form {

  constructor (app) {
    content = new model(app.settings.content);
  }
}
这就是测试(到目前为止)

我使用以下命令运行测试:

npm run test-unit
//which equates to
"test-unit": "BABEL_DISABLE_CACHE=1 ./node_modules/.bin/mocha --recursive --check-leaks --reporter spec --bail --compilers js:babel/register ./test/unit"
模型类使用与控制器相同的模式构建(例如导出默认类、构造函数等)。问题在于,在控制器构造函数中,模型不是存根,而是类本身


任何关于如何做的建议,甚至我是否需要测试它的建议都非常受欢迎。

这里是使用附加库
proxyquire
的单元测试解决方案,并为ES6类构造函数做出断言

/controller/Form.js

从“./models/Form”导入模型;
让内容;
导出默认类窗体{
建造师(应用程序){
内容=新模型(app.settings.content);
}
}
/models/Form.js

导出默认类FormModel{
私人内容;
建造师(内容){
this.content=内容;
}
}
/controller/Form.test.js

从“chai”导入{assert};
从“sinon”进口sinon;
从“proxyquire”导入proxyquire;
让mocks={};
描述(“表单控制器”,()=>{
描述(“新表单控制器”,()=>{
在每个之前(()=>{
mocks.app={
设置:{
内容:“/content/path/”,
视图:“/views/path/”,
},
};
mocks.model=sinon.stub();
const{default:controller}=proxyquire(“./Form”{
“./型号/表格”:{
默认值:mocks.model,
},
});
mocks.controller=新控制器(mocks.app);
});
之后(()=>{
mocks=null;
});
它(“实例化模型”,()=>{
isTrue(mocks.model.calledWith(mocks.app.settings.content));
});
});
});
单元测试结果和覆盖率报告:

表单控制器
新表单控制器
✓ 实例化一个模型
1次通过(200ms)
---------------|----------|----------|----------|----------|-------------------|
文件|%Stmts |%Branch |%Funcs |%Line |未覆盖行|s|
---------------|----------|----------|----------|----------|-------------------|
所有文件| 95.45 | 100 | 88.89 | 95.45 ||
控制器| 100 | 100 | 100 | 100 ||
表格.test.ts | 100 | 100 | 100 | 100 ||
表格.ts | 100 | 100 | 100 | 100 ||
型号| 66.67 | 100 | 50 | 66.67 ||
表格.ts | 66.67 | 100 | 50 | 66.67 | 4|
---------------|----------|----------|----------|----------|-------------------|

源代码:

这是使用附加库
proxyquire的单元测试解决方案,并为ES6类构造函数做出断言

/controller/Form.js

从“./models/Form”导入模型;
让内容;
导出默认类窗体{
建造师(应用程序){
内容=新模型(app.settings.content);
}
}
/models/Form.js

导出默认类FormModel{
私人内容;
建造师(内容){
this.content=内容;
}
}
/controller/Form.test.js

从“chai”导入{assert};
从“sinon”进口sinon;
从“proxyquire”导入proxyquire;
让mocks={};
描述(“表单控制器”,()=>{
描述(“新表单控制器”,()=>{
在每个之前(()=>{
mocks.app={
设置:{
内容:“/content/path/”,
视图:“/views/path/”,
},
};
mocks.model=sinon.stub();
const{default:controller}=proxyquire(“./Form”{
“./型号/表格”:{
默认值:mocks.model,
},
});
mocks.controller=新控制器(mocks.app);
});
之后(()=>{
mocks=null;
});
它(“实例化模型”,()=>{
isTrue(mocks.model.calledWith(mocks.app.settings.content));
});
});
});
单元测试结果和覆盖率报告:

表单控制器
新表单控制器
✓ 实例化一个模型
1次通过(200ms)
---------------|----------|----------|----------|----------|-------------------|
文件|%Stmts |%Branch |%Funcs |%Line |未覆盖行|s|
---------------|----------|----------|----------|----------|-------------------|
所有文件| 95.45 | 100 | 88.89 | 95.45 ||
控制器| 100 | 100 | 100 | 100 ||
表格.test.ts | 100 | 100 | 100 | 100 ||
表格.ts | 100 | 100 | 100 | 100 ||
型号| 66.67 | 100 | 50 | 66.67 ||
表格.ts | 66.67 | 100 | 50 | 66.67 | 4|
---------------|----------|----------|----------|----------|-------------------|

源代码:

您可以通过将“模型”实例注入到“表单”构造函数中而不是在那里创建它来避免这种难以测试的代码。通过这种方式,您不需要依赖类中的全局变量,因此拥有可测试的代码。您可以通过将“模型”实例注入“表单”构造函数而不是在其中创建它来避免这种难以测试的代码。通过这种方式,您不依赖类中的全局变量,因此具有可测试代码。
npm run test-unit
//which equates to
"test-unit": "BABEL_DISABLE_CACHE=1 ./node_modules/.bin/mocha --recursive --check-leaks --reporter spec --bail --compilers js:babel/register ./test/unit"