Как написать тест для service в nestjs
Я написал так, но по покритию он не проходит на все 100 процентов Помогите дописать От мой код
import { HttpService } from '@nestjs/axios';
import { Injectable } from '@nestjs/common';
import CONFIG from '@application-config';
import { firstValueFrom } from 'rxjs';
const { TESTNET, API_KEY } = CONFIG.POLYGONSCAN;
@Injectable()
export class AbiService {
constructor(private readonly httpService: HttpService) {}
public async getContractAbi(address: string) {
const urlFactory = new URL(TESTNET);
urlFactory.searchParams.append('module', 'contract');
urlFactory.searchParams.append('action', 'getabi');
urlFactory.searchParams.append('address', address);
urlFactory.searchParams.append('apikey', API_KEY);
const url = urlFactory.href;
const { data } = await firstValueFrom(this.httpService.get(url));
return data.result;
}
}
И сам spec файл
import { HttpService } from '@nestjs/axios';
import { AbiService } from './abi.service';
describe('AbiService', () => {
let abiService: AbiService;
let httpService: HttpService;
beforeEach(async () => {
abiService = new AbiService(httpService);
});
describe('getContractAbi', () => {
it('should return contract abi', async () => {
const result =
'[{"inputs":[{"internalType":"string","name":"_nftName","type":"string"},{"internalType":"string","name":"_nftSymbol","type":"string"},{"internalType":"address","name":"_tokenContractAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"poolAddress","type":"address"},{"indexed":false,"internalType":"string","name":"poolName","type":"string"}],"name":"PoolRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"validatorAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ValidatorNFTMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"validatorAddress","type":"address"},{"indexed":false,"internalType":"address","name":"validatorContract","type":"address"},{"indexed":false,"internalType":"uint256","name":"stakedAmount","type":"uint256"}],"name":"ValidatorRegistered","type":"event"},{"inputs":[{"internalType":"string","name":"_poolName","type":"string"},{"internalType":"string","name":"_queryUrl","type":"string"}],"name":"addQuery","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_poolName","type":"string"},{"internalType":"string","name":"_queryUrl","type":"string"},{"internalType":"string","name":"_validatedQuery","type":"string"}],"name":"addValidation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"burnNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_validatorAddress","type":"address"}],"name":"closeValidator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nftAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_poolName","type":"string"}],"name":"poolContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_poolName","type":"string"}],"name":"registerPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_validatorAddress","type":"address"},{"internalType":"uint256","name":"_stakedAmount","type":"uint256"}],"name":"registerValidator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_validatorAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"rewardValidator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_validatorAddress","type":"address"}],"name":"validatorContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]';
jest
.spyOn(abiService, 'getContractAbi')
.mockImplementation(async () => result);
expect(
await abiService.getContractAbi(
'0x8c6286B100C9347E6AD697a38ECdd83ad71e7ae5',
),
).toBe(result);
});
});
});
Модуль
import { Module } from '@nestjs/common';
import { HttpModule } from '@nestjs/axios';
import { AbiService } from './abi.service';
@Module({
imports: [HttpModule],
providers: [AbiService],
exports: [AbiService],
})
export class AbiModule {}