त्रुटि के कारण जेस्ट के साथ पोस्ट के तरीकों का परीक्षण करने में असमर्थ, अपरिभाषित के कार्यान्वयन को पढ़ नहीं सकते हैं


9

मेरे पास एक एपीआई सेवा है जहां मेरे पास एपीआई को कॉल करने के लिए अलग-अलग तरीके हैं। मैंने GET के सभी अनुरोधों का सफलतापूर्वक परीक्षण किया है, लेकिन मुझे POST अनुरोधों के परीक्षण में परेशानी हो रही है।

यह विधि है:

export default class ApiService {
  static makeApiCall = <T>(
    url: string,
    oneCb: <T>(d: Data) => T,
    secondCb: (d: T) => void,
    errorCb?: (a: ErrorModel) => void,
    method = 'get',
    data = {},
  ): Promise<void> => {
    const config: AxiosRequestConfig = {};
    if (method === 'post') {
      config.headers = header;
      return ApiClient.post(url, data, config)
        .then(res => callback(normalizeCallback(res.data))).catch(error => someHandler(error));            
    } else {
      return ApiClient.get(url)
        .then(res => callback(normalizeCallback(res.data))).catch(error => someHandler(error));
    }
  };

  // ONLY ONE POST METHOD TO MAKE IT MORE CLEAR
  static someArchiveMethod = (
    callback: (a: SuccessModel) => void,
    errorCallback: (error: ErrorModel) => void,
    cardId: string
  ): Promise<void> => {
    return ApiService.makeApiCall<SuccessfulResponse>(
      'appreciationCard/archive',
      Normalizer.successfulResponse,
      callback,
      errorCallback,
      'post',
      { cardId }
    );
  };

  // HERE BELOW THE GET METHODS
  static getPeople = (cb: (a: PeopleModel[]) => void, page?: number, limit?: number): Promise<void> => {
    const queryDetails = { page, limit };
    return ApiService.makeApiCall<PeopleModel[]>(
      `people?${toQueryString(queryDetails)}`,
      Normalizer.normalizePeople,
      callback
    );
  };
};

यह मैं GET से संबंधित हर चीज का परीक्षण कर रहा हूं:

describe('apiService', () => {
  beforeAll(() => {
    expect(ApiClient.defaults.headers.common.Authorization).toBe('Bearer test token');
    // @ts-ignore
    ApiClient.get.mockImplementation((url: string) => {
      return Promise.resolve({ data: mockData });
    });
  });

  it('should call api client method', () => {
    ApiService.makeApiCall(
      'testUrl',
      data => data,
      res => res,
      err => err,
      'get'
    );

    expect(ApiClient.get).toBeCalledTimes(1);
    expect(ApiClient.get).toBeCalledWith('testUrl');
  });

  it('should call callbacks consequently', done => {
    ApiService.makeApiCall('testUrl', firstCallback, secondCallback).then(() => {
      expect(firstCallback).toBeCalledTimes(1);
      expect(firstCallback).toBeCalledWith(mockData);
      expect(secondCallback).toBeCalledTimes(1);
      expect(secondCallback).toBeCalledWith(firstCallback(mockData));
      done();
    });
  });
});

describe('api service error flow', () => {
  beforeAll(() => {
    // @ts-ignore
    ApiClient.get.mockImplementation((url: string) => {
      console.log('error result');
      return Promise.reject(mockError);
    });
  });

  it('should handle error', done => {
    console.error = jest.fn();

    const firstCallback = jest.fn((data: any) => data);
    const secondCallback = jest.fn((data: any) => data);

    ApiService.makeApiCall('testUrl', firstCallback, secondCallback).then(() => {
      expect(firstCallback).toBeCalledTimes(0);
      expect(secondCallback).toBeCalledTimes(0);
      expect(console.error).toBeCalledTimes(1);
      expect(console.error).toBeCalledWith('ApiClient testUrl', mockError);
      done();
    });
  });
});

describe('apiService methods', () => {
  beforeAll(() => {
    ApiClient.get.mockImplementation((url: string) => {
      expect(ApiClient.defaults.headers.common.Authorization).toBe('Bearer test token');

      return Promise.resolve({ data: mockData });
    });
  });

  it('getPeople method call with one param', () => {
    ApiService.getPeople(jest.fn(), 1, 1).then(() => {
      expect(ApiClient.get).toBeCalledWith('people?page=1&limit=1');
    });
  });
})

मैंने सोचा था कि केवल के उदाहरण के सभी बदलकर ApiClient.getकरने के लिए ApiClient.postयह पोस्ट अनुरोध परीक्षण करने के लिए काम करेंगे। लेकिन जब मैं यह करने का प्रयास करता हूं कि यह ऐसा कहता है can not read mockImplementation of undefined। मैंने postपरम को अधिलेखित करने के लिए परम का उपयोग करने के लिए परीक्षणों में तरीकों को बदलने की कोशिश की, method = 'get'लेकिन मुझे कोई सफलता नहीं मिली, मुझे कोई त्रुटि नहीं मिली

TypeError: apiClient_1.default.post एक फ़ंक्शन नहीं है

कोई विचार?


इसका एक कारण यह होगा कि ApiClientविधि नहीं है post
टॉमस

नमस्ते, @ टोमस इस लाइन को देखते हैं -> return ApiClient.post(url, data, config) .then(res => callback(normalizeCallback(res.data))).catch(error => someHandler(error));और यह ठीक से काम करता है जब मैं पोस्ट अनुरोध करने का प्रयास करता हूं। मेरा मतलब है कि मेरे पास 17 पोस्ट अनुरोधों की तरह काम कर रहे हैं जो उन्हें चाहिए। तो क्यों परीक्षणों में काम नहीं करते हैं?
प्रतिक्रिया

@Reacting "पोस्ट" इकाई परीक्षण उदाहरण साझा करें
ओरोन बेन डेविड

@ OronBen-David मैंने इस सवाल का उल्लेख किया कि मैंने getपरीक्षण में बिल्कुल वैसा ही प्रयास किया लेकिन मैंने इसके बजाय सभी उदाहरणों को बदल दिया getऔर सेट कर postदिया।
प्रतिक्रिया

मैं समझता हूं, लेकिन यह उस कोड का उल्लेख करने के लिए अधिक स्पष्ट होगा जो काम नहीं कर रहा है
ओरॉन बेन-डेविड

जवाबों:


5

मैंने आपकी समस्या की जांच की है। सबसे पहले, मैं बताना चाहता हूं कि आपके कोड में कॉलबैक जैसे कुछ मुद्दे हैं जिन्हें आपने परिभाषित नहीं किया है, अस्पष्ट परिभाषित करना ApiClientआदि।

इसलिए, मैंने आपके मुद्दे को पुन: पेश करने के लिए एक प्रतिकृति उदाहरण बनाया जिसमें मैंने आपके कोड को थोड़ा सरल किया लेकिन सभी मुख्य तत्व हैं।

कृपया, https://repl.it/@SergeyMell/Some-Jesting पर एक नज़र डालें

यह बिना किसी समस्या के दोनों तरीकों getऔर postविधियों के लिए सफलतापूर्वक काम करता है । यहाँ, मुख्य बिंदु हैं जिन पर आपको अपना ध्यान देना चाहिए:

  1. के axiosरूप में उपयोग करना ApiClient। (यह आपके प्रश्न से स्पष्ट नहीं था इसलिए मैंने मान लिया कि यह ऐसा है)
    const ApiClient = require('axios');
  2. Jest mocks सेट पर axios(मान लीजिए, आप भी ऐसा ही करते हैं)
    jest.mock('axios');
  3. दोनों को एक ही तरह से विनती करना getऔर postएक ही तरीके से अनुरोध करना (आपके तरीके के अनुसार)

    ApiClient.get.mockImplementation((url) => {
      return Promise.resolve({ data: mockData });
    });
    
    ApiClient.post.mockImplementation((url) => {
      return Promise.resolve({ data: mockData });
    });

तो, कृपया, मेरे उदाहरण की जांच करें, अपने कोड के साथ मतभेदों की जांच करें और मुझे कुछ अतिरिक्त अलगाव के बारे में बताएं जो आपको आवश्यकता हो सकती है।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.