Реагировать Тестовый пример для кнопки отключенной или нет на основе значения состояния

Я пытаюсь написать тестовые примеры для включения или отключения кнопок.

<button type = "button" id = "addBtn" className = {`btn border-0 create-job-btn ${enabled ? 'add-btn' : 'jd-button'}`} disabled = {!enabled} >Add/Paste Jd</button>
<span className = "pl-1 pr-1"> or </span>
<button type = "button" id = "uploadBtn" className = {`btn border-0 create-job-btn ${enabled ? "upload-btn" : "jd-button"}`} disabled = {!enabled} >Upload Jd File</button>

Теперь, что я пробовал,

it('should have buttons', () => {
        const wrapper = shallow(<SelectCriteraNewJob />);
        expect(wrapper.find('button#addBtn')).toBeTruthy();
        expect(wrapper.find('button#uploadBtn')).toBeTruthy();
    });

Теперь здесь,

const enabled = (!!selectedTechnology && selectedTechnology.length > 0) && (!!userCompany && userCompany.length > 0)

Итак, я запутался в написании тест-кейсов для кнопок enable and disable.

Итак, может ли кто-нибудь помочь мне с этим? Спасибо.

вы можете шпионить за объектами selectedTechnology и userCompany и проверять их

Dhaval Patel 11.02.2019 06:34

выбранные технологии и пользовательская компания хранятся в вашем состоянии? или он передается как опора или задается как константа?

Harvey 12.02.2019 07:23

это хранится в состоянии

ganesh 13.02.2019 05:15

const { selectedTechnology } = this.state; const {userCompany} = this.props; const enabled = (!!selectedTechnology && selectedTechnology.length > 0) && (!!userCompany && userCompany.length > 0)

ganesh 13.02.2019 06:07

@Harvey это то, как я использовал

ganesh 14.02.2019 08:39

@ Харви Есть что-нибудь, что я пропустил?

ganesh 18.02.2019 07:01

Привет, Ганеш, ничего не пропало, извините, не могу ответить, на прошлой неделе был очень занят работой. Постараюсь ответить чуть позже :)

Harvey 18.02.2019 07:46

Хорошо, без проблем. Спасибо за это :-)

ganesh 18.02.2019 07:48
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
8
3 814
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Наблюдая за тем, что отображает ваш компонент, можно проверить три вещи:

  1. Он должен отображать 2 кнопки как дочерние
  2. Когда эти кнопки включены или отключены
  3. classNames этих компонентов

Основным тестовым случаем является «включенный» случай. Тестировать имена классов или нет, зависит от вас, в основном нет необходимости тестировать встроенные стили или классы CSS.

Кажется, что обе кнопки отключены, если userCompany и/или selectedTechnology не заданы, а если они оба заданы, обе кнопки включены.

Вы можете наблюдать «отключенную» поддержку кнопок html в соответствии с состоянием и поддержкой, которую вы дали компоненту.

const wrapper = shallow(<SelectCriteraNewJob userCompany='Some Company' />);

it('SelectCriteraNewJob should render two buttons as children', () => {
    expect(wrapper.childAt(0).type()).toEqual('button');
    // expect(wrapper.childAt(1).type()).toEqual('span'); if you want to, not necessary to test
    expect(wrapper.childAt(2).type()).toEqual('button');
});

describe('If technology and company are not empty, both buttons are enabled. Otherwise disabled.',() => {
    expect(wrapper.find('button#addBtn')).toBeTruthy();
    expect(wrapper.find('button#uploadBtn')).toBeTruthy();

    test('Company and technology given', () => {
        wrapper.setState({selectedTechnology: 'React'});
        const addBtn = wrapper.find('button#addBtn').prop('disabled');
        const uploadBtn = wrapper.find('button#uploadBtn').prop('disabled');
        expect(addBtn).toBeFalsy();
        expect(uploadBtn).toBeFalsy();
    });
    test('Only technology given', () => {
        wrapper.setProps({userCompany:''});
        const addBtn = wrapper.find('button#addBtn').prop('disabled');
        const uploadBtn = wrapper.find('button#uploadBtn').prop('disabled');
        expect(addBtn).toBeTruthy();
        expect(uploadBtn).toBeTruthy();
    });
    test('Only company given', () => {
        wrapper.setState({selectedTechnology:''});
        wrapper.setProps({userCompany:'Some Company'});
        const addBtn = wrapper.find('button#addBtn').prop('disabled');
        const uploadBtn = wrapper.find('button#uploadBtn').prop('disabled');
        expect(addBtn).toBeTruthy();
        expect(uploadBtn).toBeTruthy();
    });
    test('Neither are given', () => {
        wrapper.setState({selectedTechnology:''});
        wrapper.setProps({userCompany:''});
        const addBtn = wrapper.find('button#addBtn').prop('disabled');
        const uploadBtn = wrapper.find('button#uploadBtn').prop('disabled');
        expect(addBtn).toBeTruthy();
        expect(uploadBtn).toBeTruthy();
        expect(wrapper.find('button.jd-button')).toHaveLength(2); //optional, test css class name
    });
});

Итак, таким образом мы можем использовать значения состояния в тестовом примере. Большое спасибо не только за ответ, но и за то, что вы научили меня чему-то новому. Итак, таким образом я могу протестировать компонент, использующий локальное состояние. Что, если значение для пользовательской компании исходит от моего редуктора, использующего mapStateToProps в том же компоненте?

ganesh 18.02.2019 10:08

Я не проводил много тестов с реакцией + редукцией вместе, только тестировал их отдельно для модульного тестирования. но этот блог может вам помочь jsramblings.com/2018/01/15/…

Harvey 18.02.2019 11:46

Я всегда получаю эту ошибку. Метод props предназначен для запуска на 1 узле. Вместо этого найдено 0.

ganesh 19.02.2019 09:43

Другие вопросы по теме