#node.js #redis #jestjs #mocking
#node.js #redis #jestjs #издевательство
Вопрос:
Привет, у меня есть тест, в котором я хочу издеваться над redis, а затем получить эти значения. Я установил redis-mock
пакет npm и в шутливом тесте я хочу сделать что-то вроде этого:
import redis from 'redis-mock';
describe('test', () => {
const redisClient = redis.createClient();
redis.set('key', 'myKeyValue')
it ('should do sth', async () => {
const redisValue = redis.get('key');
console.log(redisValue);
expect(redisValue).toBe('myKeyValue');
})
)
Но это не работает. Я получил undefined
значение. Как сделать что-то подобное?
Ответ №1:
redis.set()
и redis.get()
методы выполняются асинхронно, они принимают функцию обратного вызова. Смотрите Реализацию redis.get()
и пример модульного тестирования.
Вы должны получить значение после завершения операции set.
import redis from 'redis-mock';
describe('test', () => {
it('should do sth', (done) => {
const redisClient = redis.createClient();
redisClient.set('key', 'myKeyValue', () => {
redisClient.get('key', (err, redisValue) => {
console.log(redisValue);
expect(redisValue).toBe('myKeyValue');
done();
});
});
});
});
результат теста:
PASS examples/66336108/index.test.ts
test
✓ should do sth (10 ms)
console.log
myKeyValue
at examples/66336108/index.test.ts:8:17
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 1.277 s, estimated 2 s
Ответ №2:
Это может быть не по теме, но я просто хочу поделиться тем, как я тестирую redis с помощью jest без установки стороннего модуля, как я MOCK the redis
.
Это моя структура папок:
- node_modules
- tests
- __mocks__
- redis.js
- unit
- redis.test.js
- package.json
redis.js
module.exports = {
createClient() {
return {
__data: {},
get data() {
return this.__data;
},
set data(data) {
this.__data = data;
},
get(key) {
return this.data[key];
},
set(key, value) {
this.data[key] = value;
}
}
}
}
redis.test.js
const redis = require('redis');
describe('test', () => {
const redisClient = redis.createClient();
redisClient.set('key', 'myKeyValue');
it ('should do sth', async () => {
const redisValue = redisClient.get('key');
console.log(redisValue);
expect(redisValue).toBe('myKeyValue');
});
});
результат теста:
PASS tests/unit/redis.test.js
test
✓ should do sth (10 ms)
console.log
myKeyValue
at Object.<anonymous> (tests/unit/redis.test.js:9:14)
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 0.786 s
Ran all test suites.
Done in 1.31s.
jest введет redis из __mocks__
каталога, поэтому мы не используем реальные redis из модулей узла в модульном тестировании.
Надеюсь, это поможет!