我想进行单元测试并覆盖我的代码,这是我的代码,如何用sinon覆盖createClient?
const client = redis.createClient({
retry_strategy: function(options) {
if (options.error) {
if (options.error.code === 'ECONNREFUSED') {
return new Error('The server refused the connection');
}
if (options.error.code === 'ECONNRESET') {
return new Error('The server reset the connection');
}
if (options.error.code === 'ETIMEDOUT') {
return new Error('The server timeouted the connection');
}
}
if (options.total_retry_time > 1000 * 60 * 60) {
return new Error('Retry time exhausted');
}
if (options.attempt > 10) {
return undefined;
}
return Math.min(options.attempt * 100, 3000);
}
答案 0 :(得分:0)
测试分配给retry_strategy
的功能的最简单方法是将其移至redis.createClient
调用之外并导出它:
export const retryStrategy = function (options) {
if (options.error) {
if (options.error.code === 'ECONNREFUSED') {
return new Error('The server refused the connection');
}
if (options.error.code === 'ECONNRESET') {
return new Error('The server reset the connection');
}
if (options.error.code === 'ETIMEDOUT') {
return new Error('The server timeouted the connection');
}
}
if (options.total_retry_time > 1000 * 60 * 60) {
return new Error('Retry time exhausted');
}
if (options.attempt > 10) {
return undefined;
}
return Math.min(options.attempt * 100, 3000);
}
const client = redis.createClient({
retry_strategy: retryStrategy
...
然后您可以将其导入并直接对其进行测试:
import { retryStrategy } from './your-module';
test('retryStrategy', () => {
expect(retryStrategy({ attempt: 5 })).toBe(500); // SUCCESS
...
})
答案 1 :(得分:0)
您可以使用的另一种方法是使用proxyquire模拟redis.createClient
以返回opt
,以便我们可以访问retry_strategy
。在测试中,我们调用retry_strategy
并通过其options
// test.js
const proxyquire = require('proxyquire');
const src = proxyquire('./your-source-file', { 'redis': { createClient(opt) {
return opt
}}});
const chai = require('chai');
const expect = chai.expect;
describe('testing redis ', function() {
it('refuses connection', function() {
const options = {
error: {
code: 'ECONNREFUSED'
}
}
expect(src.retry_strategy(options).message).to.equal('The server refused the connection');
});
});
这是我用于测试的源文件
// source.js
const redis = require('redis');
const client = redis.createClient({
retry_strategy: function(options) {
if (options.error) {
if (options.error.code === 'ECONNREFUSED') {
return new Error('The server refused the connection');
}
if (options.error.code === 'ECONNRESET') {
return new Error('The server reset the connection');
}
if (options.error.code === 'ETIMEDOUT') {
return new Error('The server timeouted the connection');
}
}
if (options.total_retry_time > 1000 * 60 * 60) {
return new Error('Retry time exhausted');
}
if (options.attempt > 10) {
return undefined;
}
return Math.min(options.attempt * 100, 3000);
}
});
module.exports = client;