Как я могу заглушить класс в этом конкретном случае

avatar
Gonzalo Grela
9 августа 2021 в 03:00
69
0
0

Я хочу выполнить интеграционный тест, пропуская последнюю часть моих конечных точек, когда класс, который я кодирую (используя библиотеку sdk), получает данные из стороннего API. Итак, мой тестовый пример выглядит следующим образом:

describe('GET /getCustomer/:id', ()=>{

describe('get customer with id 1: ',()=>{
    it('should respond success message', (done) => {
        chai.request(app)
            .get('/api/getCustomer/customerIDsample')
            .end( function(err,res){
                expect(res).to.have.status(SUCCESS);
                done();
            });
    });
  });
});

мой Express NodeJS API работает как: маршрут -> контроллер (req, res) -> сервис (моя логика) -> шлюз/клиент. Таким образом, модуль, который мне нужно заглушить, — это шлюз/клиент. Позвольте мне показать вам путь конечной точки от начала до класса клиента:

route.js:

router.get('/getCustomer/:id', CustomerController.getCustomer

);

controller.js:

'use strict';

const { UNPROCESSABLE_ENTITY, SUCCESS, INTERNAL_SERVER_ERROR } = require('../../constants/httpCodes');

const CustomerService = require('../../services/customerService');

class CustomerController {

    static async getCustomer (req, res) {

        const customerID = req.params.id;
        const customerService = new CustomerService(customerID);

        try {
            const getCustomer = await customerService.getCustomer()
            return res.status(SUCCESS).send(getCustomer);
        } catch (error) {
            return res.status(INTERNAL_SERVER_ERROR).send({
                "details": error
            });
        }
    }
}

service.js:

'use strict';

const validate = require('jsonschema').validate;

const Client = require('../gateways/Client')
const ClientCustomerSchema = require('../schemas/ClientCustomerSchema');

class CustomerService {

    constructor(customer) {
        this.customer = customer;
    }

    async getCustomer() {
        const client = new Client(this.customer);
        try {
            const newCustomer = await client.getCustomer();
            return newCustomer;
        } catch (error) {
            throw error
        }
    }
}

client.js: это мой класс для переноса SDK из API, похожего на paypal, клиент — выдуманное имя:

'use strict';

const Client = require('Client');
const { client } = require('../config/index');

class openPayClient {

    constructor(customer) {
        this.customer = customer;
        this.client = new Client(
            client.ID,
            client.PRIVATE_KEY
        );
    }

    async getCustomer() {

        return await new Promise((resolve, reject) => {
            this.client.customers.get(this.customer, function(error, body) {
                if(error) {
                    reject(error)
                } else {
                    resolve(body)
                }
            });
        });
    }

Конечно, я провел исследование, но я нашел что-то относительно классов-заглушек в такого рода сценариях, когда на самом деле вы не используете функцию/класс явно в тестовом файле. Модуль, который мне нужно заглушить, это Client.js, потому что он использует метод client.customer.get, который вызывает внешний API через библиотеку sdk.

Источник
slideshowp2
9 августа 2021 в 03:34
0

Откуда взялся класс client? Показать минимальный, полный, правильный код

Gonzalo Grela
9 августа 2021 в 13:57
0

@slideshowp2 Надеюсь, новые детали сработают!

Gonzalo Grela
10 августа 2021 в 19:48
0

теперь плохо здесь? :D

Ответы (0)