Я пытаюсь протестировать реагирующий компонент и безуспешно использую expect(elm).not.toBeVisible()
.
Обновление 3
Я сократил код до этой более простой формы:
// ./TestItem.js
import React from 'react'
import './TestItem.css'
export default ({ hide }) => {
return <div className={hide ? 'shouldHide' : ''}>Text</div>
}
// ./__tests__/TestItem.test.js
import React from 'react'
import { render } from 'react-testing-library'
import TestItem from '../TestItem'
import 'jest-dom/extend-expect'
import 'react-testing-library/cleanup-after-each'
test.only('TestItem should render correctly', async () => {
const { getByText, debug } = render(<TestItem hide={true} />)
const itemNode = getByText('Text')
debug()
expect(itemNode).not.toBeVisible()
})
// ./TestItem.css
.shouldHide {
display: none;
}
Результат теста:
TestItem should render correctly
expect(element).not.toBeVisible()
Received element is visible:
<div class="shouldHide" />
7 | const itemNode = getByText('Text')
8 | debug()
> 9 | expect(itemNode).not.toBeVisible()
| ^
10 | })
11 |
debug()
log:
console.log node_modules/react-testing-library/dist/index.js:58
<body>
<div>
<div
class="shouldHide"
>
Text
</div>
</div>
</body>
Обновление 2:
Ладно, это становится довольно странно, потому что я получил тест на прохождение codesanbox , но все равно не могу найти удачу на моей локальной машине.
Мой оригинальный вопрос:
Я использую React, semantic-ui-реагировать и реагировать-тестирование-библиотеку.
Вот код:
// ComboItem.test.js
import React from 'react'
import ComboItem from '../ComboItem'
import { render } from 'react-testing-library'
import comboXoi from '../images/combo-xoi.jpg'
import 'path/to/semantic/semantic.min.css'
describe('ComboItem', () => {
test('should render', async () => {
const { getByText, debug } = render(
<ComboItem image={comboXoi} outOfStock={false} />
)
const outOfStockNotice = getByText('Out of stock')
debug()
expect(outOfStockNotice).not.toBeVisible()
})
})
// ComboItem.js
import React from 'react'
import { Card, Image } from 'semantic-ui-react'
export default ({ image, outOfStock = false }) => {
return (
<Card>
<Image
src={image}
dimmer={{
active: outOfStock,
inverted: true,
'data-testid': 'combo-item-dimmer',
content: (
<span style={{ marginTop: 'auto', color: 'black' }}>
Out of stock
</span>
),
}}
/>
</Card>
)
}
То, что я получаю, является результатом здесь:
ComboItem › should render
expect(element).not.toBeVisible()
Received element is visible:
<span style="margin-top: auto; color: black;" />
at Object.test (src/app/screens/App/screens/SaleEntries/screens/CreateSaleEntry/screens/StickyRiceComboSelect/__tests__/ComboItem.test.js:14:34)
at process._tickCallback (internal/process/next_tick.js:68:7)
Я пытался увидеть результат рендеринга компонента в браузере, а узел outOfStockNotice
в тестовом коде фактически скрыт, потому что его родитель, который является div с классом dimmer
, имеет стиль display: none
.
Согласно jest-dom
doc (который используется testing-react-library
:
toBeVisible
Элемент отображается, если выполнены все следующие условиявстретились:
- для его свойства css не задано значение none
- для его свойства css не задано скрытое или свернутое значение
- у него нет своего свойстваНепрозрачность свойства css, установленная в 0
- , также виден его родительский элемент (и так далее вплоть до вершины дерева DOM)
Пожалуйста, помогите.Я действительно не знаю, что здесь может пойти не так.
Обновление:
Я включаю результат debug()
здесь:
console.log node_modules/react-testing-library/dist/index.js:58
<body>
<div>
<div
class="ui card"
>
<div
class="ui image"
>
<div
class="ui inverted dimmer"
data-testid="combo-item-dimmer"
>
<div
class="content"
>
<span
style="margin-top: auto; color: black;"
>
Out of stock
</span>
</div>
</div>
<img
src="combo-xoi.jpg"
/>
</div>
</div>
</div>
</body>