ত্রুটির কারণে জেস্টের সাথে পোস্টের পদ্ধতিগুলি পরীক্ষা করতে অক্ষম তাত্পর্যপূর্ণ না করে মকআইএমপ্লিমেন্টেশন পড়তে পারে না


9

আমার একটি এপিআই পরিষেবা আছে যেখানে আমার কাছে API গুলিতে কল করার জন্য বিভিন্ন পদ্ধতি রয়েছে। আমি সমস্ত জিইটি অনুরোধ সফলভাবে পরীক্ষা করেছি তবে পোস্টের অনুরোধগুলি পরীক্ষা করতে আমার সমস্যা হচ্ছে।

এই পদ্ধতি:

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
    );
  };
};

জিইটি সম্পর্কিত সমস্ত কিছু আমি এইভাবে পরীক্ষা করছি:

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 undefinedpostপরমকে ওভাররাইট করার জন্য পরীক্ষাগুলিতে প্যারামটি ব্যবহার করার পদ্ধতিগুলি পরিবর্তন করার চেষ্টা করেছি 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 টি পোস্ট অনুরোধ রয়েছে যাতে তারা অবশ্যই কাজ করে। তাহলে কেন পরীক্ষায় কাজ হয় না?
প্রতিক্রিয়া জানানো হচ্ছে

@ পাঠানো দয়া করে "পোস্ট" ইউনিট পরীক্ষার উদাহরণ ভাগ করুন
অরন বেন-ডেভিড

@ অরনবেন-ডেভিড আমি প্রশ্নে উল্লেখ করেছি যে getপরীক্ষার মতো আমিও একই চেষ্টা করেছি কিন্তু আমি সমস্ত উদাহরণ পরিবর্তন getকরে postপরিবর্তে সেট করেছি set
প্রতিক্রিয়া

আমি বুঝতে পেরেছি, তবে যে কোডটি কাজ করছে না তার উল্লেখ করা আরও স্পষ্ট হবে
অরন বেন-ডেভিড

উত্তর:


5

আমি আপনার সমস্যা তদন্ত করেছি। প্রথমত, আমি বলতে চাই যে আপনার কোডটিতে কলিং কলব্যাক যা আপনি সংজ্ঞায়িত করেননি, অস্পষ্টভাবে সংজ্ঞায়িত করা ApiClientইত্যাদির মতো কয়েকটি সমস্যা রয়েছে etc.

সুতরাং, আমি আপনার সমস্যার পুনরুত্পাদন করার জন্য একটি Repl উদাহরণ তৈরি করেছি যাতে আমি আপনার কোডটি কিছুটা সরল করেছিলাম তবে সমস্ত মূল উপাদান রয়েছে।

দয়া করে একবার দেখুন https://repl.it/@SergeyMell/Some- জাস্টিং

এটি কোনও সমস্যা ছাড়াই উভয় getএবং postপদ্ধতির জন্য সফলভাবে কাজ করে । এখানে, আপনার প্রধান মনোযোগ দেওয়া উচিত:

  1. ব্যবহার axiosহিসাবেApiClient । (এটি আপনার প্রশ্ন থেকে পরিষ্কার ছিল না তাই আমি ধরে নিলাম যে এটি তাই)
    const ApiClient = require('axios');
  2. ঠাট্টা বিদ্রূপ স্থাপন করা 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 });
    });

সুতরাং, দয়া করে, আমার উদাহরণটি পরীক্ষা করুন, আপনার কোডের সাথে পার্থক্যগুলি পরীক্ষা করুন এবং আপনার প্রয়োজন হতে পারে এমন কিছু অতিরিক্ত বিচ্ছেদ সম্পর্কে আমাকে জানান।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.