макет redis node js и получение значений в тесте

#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 из модулей узла в модульном тестировании.

Надеюсь, это поможет!