Невозможно проверить ожидаемо (elm) .not.toBeVisible () для компонента реагирования семантического интерфейса - PullRequest
0 голосов
/ 15 октября 2018

Я пытаюсь протестировать реагирующий компонент и безуспешно использую 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>

1 Ответ

0 голосов
/ 16 октября 2018

Вот ответ , по словам самого автора react-testing-library:

Вероятно, ограничение JSDOM (в кодах и в окне он запускается в реальном браузере).На самом деле, проблема в том, что CSS не загружается в документ в JSDOM.Если бы это было так, это бы сработало.Если вы можете придумать собственное jest-преобразование, которое может вставить файл css в документ во время тестов, то вы будете настроены.

Так что это будет работать, если вы используете CSS-in-JS.

Таким образом, элемент import './TestItem.css' в тесте не будет работать, поскольку JSDOM не загружает его, поэтому jest-dom не может понять класс shouldHide, значит display: none.

Обновление:

В соответствии с этим поток переполнения стека , вы можете вставить CSS в JSDOM:

import React from 'react'
import { render } from 'react-testing-library'
import TestItem from '../TestItem'

import fs from 'fs'
import path from 'path'

test.only('TestItem should render correctly', async () => {
  const cssFile = fs.readFileSync(
    path.resolve(__dirname, '../TestItem.css'),
    'utf8'
  )
  const { container, getByText, debug } = render(<TestItem hide={true} />)

  const style = document.createElement('style')
  style.type = 'text/css'
  style.innerHTML = cssFile
  container.append(style)

  const itemNode = getByText('Text')
  debug()
  expect(itemNode).not.toBeVisible()
})

И тогда тест долженпройти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...