#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 — спасибо, что уловили мою оплошность — ответ обновлен