JavaScript: тестовая функция

#javascript

#javascript

Вопрос:

Я написал функцию ‘test’ для моего ‘counter’, но она не работает! Можете ли вы помочь понять, где я ошибаюсь?

‘test’ должен иметь метод с именем ‘toEqual’!

PS: «счетчик» — это хорошо

 function test(data) {
	toEqual: function(e) {
  	    return (
    	        this.data.bind(this) == e ? console.log('good'):console.log('sucks!')
   	    );
	}
}

const counter = (state = 0, action) => {
    switch (action.type) {
        case 'INCREMENT':
            return state   1;
        case 'DECREMENT':
            return state - 1;
        default:
            return state;
    }
}

test(
    counter(0, { type: 'INCREMENT' })
).toEqual(1);

test(
    counter(1, { type: 'INCREMENT' })
).toEqual(2);

test(
    counter(2, { type: 'DECREMENT' })
).toEqual(1);

test(
    counter(2, { type: 'DECREMENT' })
).toEqual(0);

test(
    counter(1, { type: 'SOMETHING_ELSE' })
).toEqual(1);

test(
    counter(undefined, {})
).toEqual(0);  

Комментарии:

1. Ваш код выдает синтаксические ошибки!

2. Вы путаете функции и объектные литералы. У функции нет метода.

3. @Bergi — Возможно, я неправильно понимаю ваш комментарий, но имейте в виду, что «объекты» JavaScript, безусловно, могут иметь функции в качестве членов.

4. Также вы не можете получить доступ к data параметру, как к свойству ( this. ) , а результатом вызова counter является число, поэтому вы не можете bind() этого сделать.

5. @DavidW Конечно, но OP не интересуется этим (и, вероятно, не знает о них), поэтому я проигнорировал эту деталь. Он определенно путает синтаксис, так что это то, что нужно исправить в первую очередь.

Ответ №1:

Упрощение вашего кода поможет устранить некоторую путаницу и решить проблемы с синтаксисом, с которыми вы сталкиваетесь…

Ваша текущая test функция ошибочно записывается как попытка одновременно быть функцией, а также объектом. Просто пусть test будет объектом (возможно, началом тестовой библиотеки), и пусть toEqual будет функцией (первой функцией в вашей тестовой библиотеке), которая принимает два аргумента, например:

     const test = {
      toEqual: function(counterInstance, expected) {
        return counterInstance === expected ? console.log('they are equal') : console.log('they are not equal');
      }
    }
  

Пока вы лучше не разберетесь в синтаксисе, я бы рекомендовал вам воздержаться от использования синтаксиса функции ES6 arrow => . Просто напишите counter с более простым синтаксисом функции:

     const counter = function(state, action) {
      switch (action.type) {
        case 'INCREMENT':
          return state   1;
        case 'DECREMENT':
          return state - 1;
        default:
          return state;
      }
    }
  

Затем вы можете просто вызвать свою toEqual функцию с двумя аргументами, например:

     test.toEqual(counter(0, { type: 'INCREMENT' }), 1);
  

Комментарии:

1. Я ответил на то же самое, а затем увидел, что у этого «теста» должен быть метод с именем «toEqual»!

2. @Craicerjack — спасибо, что уловили мою оплошность — ответ обновлен