SpyOn используется для обнаружения параметров, переданных базовой функции. В некоторых случаях мы хотим изменить результат сквозного вызова и вернуть его вызывающей стороне.
Как нам получить результат вызова в SpyOn до того, как он будет возвращен?
Вот пример:
import {INestApplication} from '@nestjs/common';
import {Test} from '@nestjs/testing';
import {CommonModule} from '@src/common/common.module';
import {Repository} from 'typeorm';
import {User} from '@src/database/entity/user.entity';
describe('AuthService', () => {
let service: AuthService;
let app: INestApplication;
let repo: Repository<User>;
beforeEach(async () => {
const module = await Test.createTestingModule({
imports: [CommonModule],
providers: [AuthService, {provide: 'USER_REPOSITORY',
useValue: mockRepositoryUser()},
]}).compile();
app = module.createNestApplication();
await app.init();
service = module.get<AuthService>(AuthService);
repo = module.get('USER_REPOSITORY');
});
it('test passthrough ', async () => {
const sp = jest.spyOn(repo , 'findOne').mockImplementation(async (args) => {
// here we want to first call the original FindOne function
// and get the result and then modify that
// result and return it.
const result = await originalRepo.findOne(args) <= ???
result.user = {name: 'david'};
return result;
);
service.doWork();
expect(sp).toHaveBeenCalledTimes(2);
});
});
Конечно, в mockImplementation я могу вернуть любое значение. Но скажем, я не хочу статически возвращать значение, а просто хочу использовать базовую базу данных, чтобы получить какой-то результат, а затем изменить его. Поскольку я уже издевался над всем хранилищем с некоторыми действительными данными, каждый раз, когда я вызываю findOne, я получаю действительные результаты. Но чтобы проверить случаи сбоя, я хочу изменить возвращаемые результаты сквозного вызова.
Я надеюсь, что это ясно.