我正在使用jest作为nodejs服务器的测试框架的项目。在一个控制器(称为ControllerImTesting
)上,它会告知辅助类的实例(我们将调用ClassIWantToMock
并将其用于控制器。我已经在ClassIWantToMock
周围编写了许多测试当我测试ControllerImTesting
时,我自然如此自然,我只想模仿ClassIWantToMock
。
这很简单,我在__mocks__
创建了另一个js文件,其中包含ClassIWantToMock
的哑版本。当我在ControllerImTesting
中新建时,我希望它使用__mocks__
中的哑版。
此时我尝试了很多配置,但我绝望的举动是使用setMock:
jest.setMock('/path/to/real/class/I/want/to/mock', '/path/to/dumb/version')
这怎么会失败?
但是在运行测试时,我得到TypeError: ClassIWantToMock is not a constructor
。
我查看ClassIWantToMock
的愚蠢版本,并将样式从const ClassIWantToMock = (req) => {
更改为class ClassIWantToMock {
。我得到了同样的错误,因为使用es6类样式只是语法糖。
只是为了确认,在我的真实控制器中,我写了一行,console.log(ClassIWantToMock)
高于它新闻实例的行。它确实打印出'/path/to/dumb/version'
。 试图嘲笑但不能。
这是Jest的限制吗?或者我只是没有正确使用它? - >该怎么做?
./ClassIWantToMock.js
class ClassIWantToMock {
constructor(stuff) {
this.stuff = stuff
}
doStuff() {
console.log('some real stuff')
}
}
module.exports = ClassIWantToMock
./__mocks__/ClassIWantToMock.js
class ClassIWantToMock {
constructor(fakeStuff) {
this.fakeStuff = fakeStuff
}
doStuff() {
console.log('some fake stuff')
}
}
module.exports = ClassIWantToMock
./ControllerImTesting.js
const ClassIWantToMock = require('./ClassIWantToMock')
class ControllerImTesting {
static aMethod(req, res, next) {
const helper = ClassIWantToMock('real stuff')
helper.doStuff()
return next()
}
}
module.exports = ClassIWantToMock
./ControllerImTesting.spec.js
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'
})
})
})