jest支持模拟javascript'类'

时间:2017-06-09 20:28:04

标签: javascript ecmascript-6 jestjs

我正在使用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'
        })
    })
})

0 个答案:

没有答案