gpt4 book ai didi

javascript - 在使用 Jest 时模拟被测试者调用的服务方法

转载 作者:行者123 更新时间:2023-12-03 16:44:55 24 4
gpt4 key购买 nike

我正在尝试模拟我从测试中导出为模块的方法服务。
这是我用“sinon”做的事情,但我想尽可能多地使用 jest。

这是一个经典的测试,我有一个“身份验证”服务和一个“邮件”服务。

“身份验证”服务可以注册新用户,每次新注册后,它都会要求邮件服务向新用户发送一封“欢迎邮件”。

所以测试我的身份验证服务的注册方法,我想断言(和模拟)邮件服务的“发送”方法。

怎么做?这是我尝试过的,但它调用了原始的 mailer.send 方法:

// authentication.js

const mailer = require('./mailer');

class authentication {
register() { // The method i am trying to test
// ...

mailer.send();
}
}

const authentication = new Authentication();

module.exports = authentication;


// mailer.js

class Mailer {
send() { // The method i am trying to mock
// ...
}
}

const mailer = new Mailer();

module.exports = mailer;


// authentication.test.js

const authentication = require('../../services/authentication');

describe('Service Authentication', () => {
describe('register', () => {
test('should send a welcome email', done => {
co(function* () {
try {
jest.mock('../../services/mailer');
const mailer = require('../../services/mailer');
mailer.send = jest.fn( () => { // I would like this mock to be called in authentication.register()
console.log('SEND MOCK CALLED !');
return Promise.resolve();
});

yield authentication.register(knownUser);

// expect();

done();
} catch(e) {
done(e);
}
});
});
});
});

最佳答案

首先你必须模拟 mailer带有 spy 的模块,以便您以后设置。为了让您知道在测试中使用 Promise,请查看 docs有两种方法可以做到这一点。

const authentication = require('../../services/authentication');
const mailer = require('../../services/mailer');
jest.mock('../../services/mailer', () => ({send: jest.fn()}));

describe('Service Authentication', () => {
describe('register', () => {
test('should send a welcome email', async() => {
const p = Promise.resolve()
mailer.send.mockImplementation(() => p)
authentication.register(knownUser);
await p
expect(mailer.send).toHaveBeenCalled;
}
});
});
});
});

关于javascript - 在使用 Jest 时模拟被测试者调用的服务方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43727308/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com