单元测试无状态分量法

Mad*_*ies 4 javascript unit-testing ecmascript-6 karma-runner reactjs

我有无状态的反应

const Clock = () => {
    const formatSeconds = (totalSeconds) => {
        const seconds = totalSeconds % 60,
        minutes = Math.floor(totalSeconds / 60)

        return `${minutes}:${seconds}`
    }
    return(
        <div></div>
    )
}

export default Clock
Run Code Online (Sandbox Code Playgroud)

如何测试formatSeconds方法?

我写了这个,测试失败了。

import React from 'react'
import ReactDOM from 'react-dom'
import expect from 'expect'
import TestUtils from 'react-addons-test-utils'

import Clock from '../components/Clock'

describe('Clock', () => {
    it('should exist', () => {
        expect(Clock).toExist()
    })

    describe('formatSeconds', () => {
        it('should format seconds', () => {
            const Clock = TestUtils.renderIntoDocument(<Clock />)
            const seconds = 615
            const expected = '10:15'
            const actual = Clock.formatSeconds(seconds)

            expect(actual).toBe(expected)
        })
    })
})
Run Code Online (Sandbox Code Playgroud)

第一次测试通过了,但是Clock.formatSeconds可能存在一些问题。

Ori*_*ori 6

组件Clock是一个函数,在呈现组件时会调用它。方法formatSeconds是在Clock闭包内部定义的,它不是的属性Clock,因此您不能从外部访问它。

另外,您将formatSeconds在每个渲染器上重新创建该方法,并且由于该方法实际上未在范围中使用任何道具,因此有点浪费。因此,您可以取出该方法,然后将其导出。您也可以将其移动到另一个实用程序文件中,然后将其导入,因为它不是的组成部分Clock,并且您可能想在其他地方重用它。

export const formatSeconds = (totalSeconds) => {
    const seconds = totalSeconds % 60,
    minutes = Math.floor(totalSeconds / 60)

    return `${minutes}:${seconds}`
}

const Clock = () => {
    return(
        <div></div>
    )
}

export default Clock
Run Code Online (Sandbox Code Playgroud)

现在测试也很容易:

import React from 'react'
import ReactDOM from 'react-dom'
import expect from 'expect'
import TestUtils from 'react-addons-test-utils'

import Clock, { formatSeconds } from '../components/Clock' // import formatSeconds as well

describe('Clock', () => {
    it('should exist', () => {
        expect(Clock).toExist()
    })

    describe('formatSeconds', () => {
        it('should format seconds', () => {
            const seconds = 615
            const expected = '10:15'
            const actual = formatSeconds(seconds) // use it by itself

            expect(actual).toBe(expected)
        })
    })
})
Run Code Online (Sandbox Code Playgroud)