测试我们的三维场景

Testing 测试

像其他应用程序一样,测试是发布应用程序发布到公共环境的前非常重要的一步。在使用React Three Fiber时,我们可以使用React Three Test Renderer来实现测试。

我们将测试在“事件和交互”中创建的codesandbox

How to test React Three Fiber

让我们先来安装下 React Three Test Rederer:

npm install @react-three/test-renderer --save-dev

如果您使用Create React App,则可以添加一个以 .test.js 结尾的文件并开始编写代码,因为React Three Test Renderer是可以和绝大部分的测试库搭配的,因此它可以与jest、jasmine等库一起使用。让我们创建一个App.test.js文件并设置所有测试用例:

import ReactThreeTestRenderer from '@react-three/test-renderer'
import { MyRotatingBox } from './App'

test('mesh to have two children', async () => {
  const renderer = await ReactThreeTestRenderer.create(<MyRotatingBox />)
})

test('click event makes box bigger', async () => {
  const renderer = await ReactThreeTestRenderer.create(<MyRotatingBox />)
})

在这里,我们创建了三个测试,并且在每个测试中,我们都使用create函数确保创建了渲染器。

让我们从第一个测试开始,并确保我们的mesh有两个子元素,即材质和立方体。

我们可以通过从刚刚创建的测试实例中获取场景及其子元素来开始,如下所示:

const meshChildren = renderer.scene.children

如果您记录此mesh,您可以看到它返回一个元素的数组,因为这是我们在场景中拥有的所有元素。

使用这个,我们可以确保获取第一个子元素并在其上使用allChildren属性,如下所示:

const meshChildren = renderer.scene.children[0].allChildren

还有一个名为children的属性,但是这个属性是用于像groups这样的元素,因为它不返回几何体和材料,为此我们需要使用allChildren。

现在,我们来创建我们的断言assertion:

expect(meshChildren.length).toBe(2)

我们的第一个测试例子看起来是这样的:

test('mesh to have two children', async () => {
  const renderer = await ReactThreeTestRenderer.create(<MyRotatingBox />)
  const mesh = renderer.scene.children[0].allChildren
  expect(mesh.length).toBe(2)
})

Testing interactions 测试交互

现在我们已经完成了第一次测试,我们可以测试我们的交互,并确保当我们点击mesh时,它确实会更新比例。

我们可以通过利用测试实例中现有的fireEvent方法来实现这一点。

我们知道可以使用以下代码获取mesh:

const mesh = renderer.scene.children[0]

我们可以通过这种方式来触发事件:

await renderer.fireEvent(mesh, 'click')

完成这些操作之后,我们还需要确保我们的场景中的mesh的属性会被更新:

expect(mesh.props.scale).toBe(1.5)

最后,我们的 test 代码看起来是这样的:

test('click event makes box bigger', async () => {
  const renderer = await ReactThreeTestRenderer.create(<MyRotatingBox />)
  const mesh = renderer.scene.children[0]
  expect(mesh.props.scale).toBe(1)
  await renderer.fireEvent(mesh, 'click')
  expect(mesh.props.scale).toBe(1.5)
})

如果你们想要了解更多关于 React Three Test Renderer,你可以查看他们的文档和仓库:

Exercises

检测我们创建的 Box 实例的颜色

用 advanceFrames 方法来检测旋转