Достаточно ли вашего модульного теста, зависит от того, что вы определяете как критические критерии для своего компонента. Если критически важно убедиться, что температура отображается правильным цветом, вы, вероятно, должны это проверить. Однако, как вы сказали, у вас есть отдельный тест для функции раскрашивания, так что этого может быть достаточно. Если это дает вам уверенность в том, что он будет работать, нет необходимости проверять его снова в weatherApp.js
Эти решения относительно субъективны и являются одной из причин, по которым модульное тестирование является сложной задачей. - относительно мало предписывающих ответов, что тестировать. Для лучшего руководства, это довольно хорошее чтение по теме .
Однако есть способы структурирования ваших компонентов, которые облегчают модульное тестирование, и в этом отношении у меня есть предложение по изменению способа построения вашего компонента, поскольку на самом деле, я думаю, вас волнует следующее:
- Компонент
WeatherApp
отображает цветные данные температуры
Справа ? Вам на самом деле не важно, что он вызывает API ... данные могут поступать откуда угодно. И вы на самом деле не заботитесь о том, что он вызывает функцию colorize ... только о том, что применяется цвет. Тестирование этих деталей только делает ваш модульный тест хрупким, что означает, например, что вам придется обновить определение модульного теста, если ваш API изменится.
Вместо этого сделайте компонент WeatherApp
без состояния и презентационным. Используйте родительский компонент для обработки:
- Вызов API
- Расчет цвета
- Отрисовка
WeatherApp
class ParentComponent extends React.Component {
constructor(props) {
super(props);
this.state = {
temp: undefined,
color: undefined,
}
}
componentDidMount() {
temperatureData().then(temp => {
this.setState({
temp: temp
color: colorize(temp)
})
})
}
render(
return (
<WeatherApp temp={this.state.temp} color={this.state.color} />
)
)
}
Тогда ваш тест будет выглядеть примерно так:
describe("<WeatherApp> component test", () => {
test("displays data from temperature data", () => {
const mockedTemp = "something irrelevant";
const weatherComponent = render(<WeatherApp temp={mockedTemp} />);
const paragraph = weatherComponent.getByText(mockedTemp)
expect(paragraph).toBeInTheDocument()
})
})
Вы можете включить цвет в тест или нет ... на ваше усмотрение.
Так как вы можете протестировать все 3 units
(temp / color / weatherApp), которые составляют родительский компонент отдельно, вы можете быть относительно уверены, что родительский компонент будет работать. У вас также есть дополнительный бонус в виде отсутствия необходимости писать какой-либо асинхронный код в модульном тесте.