Javascript 带有sinon.js的存根ES6类
我有一个控制器类,它实例化了一个模型类,我想测试控制器在实例化模型时是否使用了正确的参数。我发现在一个带有sinon的类上存根方法没有问题,但是如果我需要存根构造函数,我就无法让它工作 这是我的控制器: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) {
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"