像其他应用程序一样,测试是发布应用程序发布到公共环境的前非常重要的一步。在使用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('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,你可以查看他们的文档和仓库:
— 检测我们创建的 Box 实例的颜色
— 用 advanceFrames 方法来检测旋转