Как написать тест для 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 {}

Ответы (0 шт):