Метод Jest spiedOn не вызывается, а вызывается один раз, изменяя порядок тестовых случаев - PullRequest
1 голос
/ 25 января 2020
  • Код Spied on не вызывается, когда тест находится на второй позиции. (или второй render) и тестовый набор не пройден c Пример OOTB создания-реагирования-приложения и еще более упрощение его для MCVE:

    MyModule. js

    import React from 'react';
    import someClass from './someClass';
    
    function App() {
      someClass.track("someevent");
      return null;
    }
    
    export default App;
    

    someClass. js

    class SomeClass {
      constructor() {
        this.someProp = null;
      }
      getSatellite() {
          return {
            track: () => {}
          };
      }
      track(someProp) {
        ///THIS BELOW IF CLAUSE IS THE PROBLEM
        if (this.someProp === someProp) {
          return;
        } else {
          this.someProp = someProp;
        }
        ///////////////////////
        this.getSatellite().track('someevent');
      }
    }
    
    const instance = new SomeClass();
    
    export default instance;
    
    

    Приложение. js

    import React from 'react';
    import MyModule from './MyModule'
    
    function App() {
      return (
        <div className="App">
          <MyModule />
        </div>
      );
    }
    
    export default App;
    

    App.test. js

    import React from 'react';
    import { render } from '@testing-library/react';
    import App from './App';
    import someClass from './someClass';
    
    test('renders learn react link', () => {
      render(<App />);
    });
    
    // it works if this test case is first one, weird :-| 
    test('renders class', () => {
      const track = jest.fn();
      jest.spyOn(someClass, 'getSatellite').mockImplementation(()=>{
        console.log('here i am');
        return {
          track
        }
      })
      render(<App />);
      expect(track).toHaveBeenCalledTimes(1);
    });
    

    Выход:

      ✓ renders learn react link (17ms)
      ✕ renders class (5ms)
    
      ● renders class
    
        expect(jest.fn()).toHaveBeenCalledTimes(expected)
    
        Expected number of calls: 1
        Received number of calls: 0
    
          18 |   })
          19 |   render(<App />);
        > 20 |   expect(track).toHaveBeenCalledTimes(1);
             |                 ^
          21 | });
          22 | 
    
          at Object.<anonymous> (src/App.test.js:20:17)
    
    Test Suites: 1 failed, 1 total
    Tests:       1 failed, 1 passed, 2 total
    Snapshots:   0 total
    Time:        10.472s
    

    Дайте мне знать, если вам нужно что-нибудь в комментариях.

1 Ответ

1 голос
/ 25 января 2020

В первом render(<App />) someProp из someClass устанавливается как someevent.

Теперь при следующем рендере я только высмеиваю вызов функции, но не сбрасываю someProp. Вот почему if (this.someProp === someProp) вступает в силу.

Поэтому мне нужно сбросить someProp на другое значение или null, и он будет работать нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...