jest支持模拟javascript';类别';
我参与的一个项目使用jest作为nodejs服务器的测试框架。在一个控制器(称为jest支持模拟javascript';类别';,javascript,ecmascript-6,jestjs,Javascript,Ecmascript 6,Jestjs,我参与的一个项目使用jest作为nodejs服务器的测试框架。在一个控制器(称为ControllerImTesting)上,它会更新一个helper类的实例(我们将调用classiswanttomock并将其用于控制器。我已经在classiswanttomock本身编写了许多测试,所以当我测试ControllerImTesting时,我只想模拟classiswanttomock 这很简单,我在\uuuuMocks\uuuuuuuuuuuuuu中创建了另一个js文件,其中包含ClassiWanto
ControllerImTesting
)上,它会更新一个helper类的实例(我们将调用classiswanttomock
并将其用于控制器。我已经在classiswanttomock
本身编写了许多测试,所以当我测试ControllerImTesting
时,我只想模拟classiswanttomock
这很简单,我在\uuuuMocks\uuuuuuuuuuuuuu
中创建了另一个js文件,其中包含ClassiWantomock
的哑版本。当我在ControllerImTesting
中新建它时,我希望它在\uuuuuuuMocks\uuuuuuuuuuuuuu
中使用哑版本
在这一点上,我已经尝试了很多配置,但我的绝望之举是使用setMock,比如:
jest.setMock('/path/to/real/class/I/want/to/mock','/path/to/dumb/version')
这怎么会失败
但是当运行测试时,我得到了TypeError:ClassIWantToMock不是构造函数
我查看了我的classiswanttomock
的哑版,将样式从const classiswanttomock=(req)=>{
更改为class classiswanttomock{
。我得到了同样的错误,这是有意义的,因为使用es6类样式只是语法上的甜点
只是为了确认一下,在我的真实控制器中,我在它向实例发送消息的那一行上面写了一行,console.log(classiswanttomock)
。它确实打印出了'/path/to/dumb/version'
。它试图对它进行模拟,但无法
这是玩笑的局限吗?还是我只是没有正确地使用它?-->这应该怎么做
更新
/ClassIWantToMock.js
class ClassIWantToMock {
constructor(stuff) {
this.stuff = stuff
}
doStuff() {
console.log('some real stuff')
}
}
module.exports = ClassIWantToMock
class ClassIWantToMock {
constructor(fakeStuff) {
this.fakeStuff = fakeStuff
}
doStuff() {
console.log('some fake stuff')
}
}
module.exports = ClassIWantToMock
const ClassIWantToMock = require('./ClassIWantToMock')
class ControllerImTesting {
static aMethod(req, res, next) {
const helper = ClassIWantToMock('real stuff')
helper.doStuff()
return next()
}
}
module.exports = ClassIWantToMock
jest.setMock('./ClassIWantToMock', './__mocks__/ClassIWantToMock')
const ControllerImTesting = require('./ControllerImTesting')
describe('basic test', () => {
test('should work', () => {
return ControllerImTesting.aMethod({}, {}, () => {}).then(() => {
// expect console to display 'some fake stuff'
})
})
})
/\uuuuuuuuuuuuuuuu mocks\uuuuuuuu/ClassIWantToMock.js
class ClassIWantToMock {
constructor(stuff) {
this.stuff = stuff
}
doStuff() {
console.log('some real stuff')
}
}
module.exports = ClassIWantToMock
class ClassIWantToMock {
constructor(fakeStuff) {
this.fakeStuff = fakeStuff
}
doStuff() {
console.log('some fake stuff')
}
}
module.exports = ClassIWantToMock
const ClassIWantToMock = require('./ClassIWantToMock')
class ControllerImTesting {
static aMethod(req, res, next) {
const helper = ClassIWantToMock('real stuff')
helper.doStuff()
return next()
}
}
module.exports = ClassIWantToMock
jest.setMock('./ClassIWantToMock', './__mocks__/ClassIWantToMock')
const ControllerImTesting = require('./ControllerImTesting')
describe('basic test', () => {
test('should work', () => {
return ControllerImTesting.aMethod({}, {}, () => {}).then(() => {
// expect console to display 'some fake stuff'
})
})
})
/ControllerImTesting.js
class ClassIWantToMock {
constructor(stuff) {
this.stuff = stuff
}
doStuff() {
console.log('some real stuff')
}
}
module.exports = ClassIWantToMock
class ClassIWantToMock {
constructor(fakeStuff) {
this.fakeStuff = fakeStuff
}
doStuff() {
console.log('some fake stuff')
}
}
module.exports = ClassIWantToMock
const ClassIWantToMock = require('./ClassIWantToMock')
class ControllerImTesting {
static aMethod(req, res, next) {
const helper = ClassIWantToMock('real stuff')
helper.doStuff()
return next()
}
}
module.exports = ClassIWantToMock
jest.setMock('./ClassIWantToMock', './__mocks__/ClassIWantToMock')
const ControllerImTesting = require('./ControllerImTesting')
describe('basic test', () => {
test('should work', () => {
return ControllerImTesting.aMethod({}, {}, () => {}).then(() => {
// expect console to display 'some fake stuff'
})
})
})
/ControllerImTesting.spec.js
class ClassIWantToMock {
constructor(stuff) {
this.stuff = stuff
}
doStuff() {
console.log('some real stuff')
}
}
module.exports = ClassIWantToMock
class ClassIWantToMock {
constructor(fakeStuff) {
this.fakeStuff = fakeStuff
}
doStuff() {
console.log('some fake stuff')
}
}
module.exports = ClassIWantToMock
const ClassIWantToMock = require('./ClassIWantToMock')
class ControllerImTesting {
static aMethod(req, res, next) {
const helper = ClassIWantToMock('real stuff')
helper.doStuff()
return next()
}
}
module.exports = ClassIWantToMock
jest.setMock('./ClassIWantToMock', './__mocks__/ClassIWantToMock')
const ControllerImTesting = require('./ControllerImTesting')
describe('basic test', () => {
test('should work', () => {
return ControllerImTesting.aMethod({}, {}, () => {}).then(() => {
// expect console to display 'some fake stuff'
})
})
})
我过去曾使用sinon进行嘲弄;也许可以看看这一点?不知道现在还有什么其他的东西。“我也会犯同样的错误,这是有意义的,因为使用es6类样式只是语法上的甜点。”不完全正确。不能使用
new
调用箭头函数。为了能够使用new
调用函数,需要将其声明为函数声明/表达式或类。您可能忘记导出类了吗?请发布一个更完整的示例,仅使用位和段很难提供帮助。@FelixKling补充道!