react-testing-library:验证文本截断

react-testing-library: Verify text truncation

我有一个组件“Label”,它具有基本的截断支持:

import "./styles.css";
export default function Label(props) {
  const className = props.truncate ? "truncate" : "";
  return <label className={className}>{props.children}</label>;
}

truncate css class:

.truncate {
  display: inline-block;
  overflow: hidden;
  white-space: pre;
  text-overflow: ellipsis;
  display: inline-flex;
  min-width: 0;
  max-width: 100%;
}

这是一个 codesandbox,它演示了组件,它是 truncation prop:


现在我想为截断功能添加一些测试范围。 我正在使用 react-testing-library,但是 我不确定断言文本末尾在截断时不可见的最佳方式

这是我的尝试:

const longText = 'START Lorem ipsum dolor sit amet, consectetur adipiscing elit. In ac commodo massa END';
describe('Label', () => {
  it('displays long text', () => {
    render(<Label>{longText}</Label>);
    expect(screen.getByText(/^START/)).toBeInTheDocument(); // pass
    expect(screen.getByText(/END$/)).toBeInTheDocument(); // pass
  });
  it('displays long text with truncation', () => {
    render(<Label truncate={true}>{longText}</Label>);
    expect(screen.getByText(/^START/)).toBeInTheDocument(); // pass
    expect(screen.queryByText(/END$/)).not.toBeVisible(); // FAILURE
  });
});

最后一个 expect 失败:

Received element is visible:
    <label class="truncate" />

我知道我可以测试 class 名称是否存在,但我们的团队认为依靠它是一种糟糕的做法。

是否有测试文本截断的最佳实践方法?

如果您在使用 truncate 渲染后立即添加 screen.debug,如下所示:

render(<Label truncate={true}>{longText}</Label>);

screen.debug();

输出将是:

<label class="truncate">
      START Lorem ipsum dolor sit amet, consectetur adipiscing elit. In ac commodo massa END
</label>

如您所见,整个文本都已呈现,使文本 visible/not 可见的是 css overflow 属性.

也就是说,我认为最好的方法是验证组件是否具有 overflow 属性:

expect(screen.getByText(/^START/)).toHaveStyle("overflow: hidden");