Войти в конкретный компонент реагирования с использованием Jest и энзима - PullRequest
0 голосов
/ 09 ноября 2018

Я должен написать контрольный пример для этого конкретного компонента, как указано ниже: -

import React from 'react';

import auth from 'containers/Login/authService';
class Footer extends React.Component {


    render() {

      if(!auth.loggedIn()){
        return (
          <div className="hidden">Not Logged In</div>
        );
      }else
        return (
            <footer>
                <span>XYZ</span>
            </footer>
        );
    }

}

export default Footer;

Я провел тестирование для Not Logged In part, но я не могу проверить для XYZ part. Мой файл теста ниже: -

import React from 'react';
import { mount } from 'enzyme';
import Footer from '../Footer';
import { login } from '../../../containers/Login/authService';

describe('Footer mount testing', () => {
  const wrapper = mount(<Footer />);

  it('For not logged in user', () => {
    expect(wrapper.find('.hidden').length).toBeGreaterThan(0);
  });


  it('For logged in user', () => {
    jest.mock('../../../containers/Login/authService', () => ({
      login: true,
    }));
    login.mockImplementation(() => Promise.resolve('true'));
    expect(wrapper.text()).toEqual('XYZ');
  });
});

Во время работы я всегда получаю сообщение об ошибке TypeError: Cannot read property 'mockImplementation' of undefined

Я не могу войти в этот модуль для проверки.

контейнеры / логин / файл authService, как показано ниже: -

import request from 'utils/request';
import {config} from 'utils/config';
let localStorage;

// If we're testing, use a local storage polyfill
if (global.process && process.env.NODE_ENV === 'test') {
  localStorage = require('localStorage');
} else {
  // If not, use the browser one
  localStorage = global.window.localStorage;
}

let auth = {
  /**
   * Logs a user in, returning a promise with `true` when done
   * @param  {string} username The username of the user
   * @param  {string} password The password of the user
   */
  login (username, password) {
    if (auth.loggedIn()) return Promise.resolve(true);

var data ={username:username, password:password}
    console.log("#" + data + "#");

    let requestData = {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        "Authorization": "Basic d2ViX2FwcDo="
      },
      body : JSON.stringify(data)
    };

    return request.post(config.serverHost+'/api/core/login', requestData)
      .then(response => {
        console.log('response received',response);
        // Save token to local storage
       // if(response.status == 200)
        localStorage.token = JSON.stringify(response);
        return Promise.resolve(response)
      })
  },

  logout () {

    return new Promise((resolve, reject) => {
      localStorage.removeItem('token');
      resolve(true)
    });

  },
  /**
   * Checks if a user is logged in
   */
  loggedIn () {
    return !!localStorage.token
  },

export default auth

1 Ответ

0 голосов
/ 09 ноября 2018

mockImplementation нельзя использовать на login, потому что это не функция.Не имеет смысла имитировать его в Footer тесте, потому что ближайший юнит для проверки - loggedIn.

Правильный юнит-тест:

jest.spyOn(auth, 'loggedIn').mockReturnValue(true);
const wrapper = mount(<Footer />);
expect(wrapper.text()).toEqual('XYZ');

Проблема с этимНабор тестов состоит в том, что тесты перекрестно загрязнены.mount должно быть сделано в beforeEach, а не в describe scope.

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