jest支持模拟javascript';类别';

jest支持模拟javascript';类别';,javascript,ecmascript-6,jestjs,Javascript,Ecmascript 6,Jestjs,我参与的一个项目使用jest作为nodejs服务器的测试框架。在一个控制器(称为ControllerImTesting)上,它会更新一个helper类的实例(我们将调用classiswanttomock并将其用于控制器。我已经在classiswanttomock本身编写了许多测试,所以当我测试ControllerImTesting时,我只想模拟classiswanttomock 这很简单,我在\uuuuMocks\uuuuuuuuuuuuuu中创建了另一个js文件,其中包含ClassiWanto

我参与的一个项目使用jest作为nodejs服务器的测试框架。在一个控制器(称为
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补充道!