deku-testutils
A collection of Deku test utilities.
Install
npm install deku-testutils
Includes:
- component-mock: A wrapper for deku components to facilitate easier unit-testing.
- assert-element: Assertions that can be used when working with Deku/React and JSX.
- deku-component-mount: Mount a Deku component to the DOM.
- deku-component-is-node: Determine if an object is a valid Deku node.
- deku-component-find-all: Traverse a Deku component tree and return all components that satisfy a function.
- deku-component-find-class:Traverse a Deku component tree and return with a given class name.
API
utils.Mock
Mock(Component)
Returns a wrapper object for the Component
. The goal is that there will be
many methods that reflect various lifecycle events for the deku component.
Currently, we only deal with render
, but others will be added over time as
we develop good testing strategies.
mock.render(component)
Calls Component.render()
. The render function will have all the parameters
it would normally expect generated automatically. (eg: props
,
props.children
and state
)
This also uses Component.defaultProps
and Component.initialState()
to ensure
the component
object is generated accurately.
The setState
function that is passed is simply a no-op, it won't trigger any
other changes. (as it shouldn't, since this is designed for unit-testing)
utils.assert
assert.isNode(node, [type])
Checks the given node
to make sure it looks like a virtual node. If the type
is specified, it must match strictly.
assert;assert;assert;
assert.hasAttribute(node, attr, [value])
Checks the given node
to make sure it has the given attr
attribute. If the
value
is specified, it must match that value strictly.
assert;assert;
When using a Function
, it will be invoked with the attribute value. From there, you
can run any other assertion that should throw if the value is invalid.
assert;
NOTE: this allows for falsy values, as an attribute can be present but intentionally
false, such as checked={false}
.
assert.notHasAttribute(node, attr)
Checks the given node
to make sure it does not have the given attr
attribute.
assert;
NOTE: this will not throw for falsy values, as an attribute can be present but
intentionally false, such as checked={false}
.
assert.hasClass(node, name)
Checks that the given node
has the given CSS class name
. This is largely a helper
for HTML elements, although any component that uses class
in the same fashion can be
checked.
assert;
assert.notHasClass(node, name)
Checks that the given node
does not have the given CSS class name
. This is largely
a helper for HTML elements, although any component that uses class
in the same fashion
can be checked.
assert;
assert.hasChildren(node, [children])
Checks that the given node
has child nodes matching the children
argument:
- when a
Number
, it will ensurenode
has that many child nodes - when a
Function
, it will run the function against each child node (which should throw if they are invalid) - when an
Array
, it will check for loose/deep equality - when not specified, it will just make sure the
node
has at least 1 child
var node = <ul> <li>a</li> <li>b</li> <li>c</li> </ul>; // make sure there are any childrenassert; // make sure there are 3 childrenassert; // our fn just runs other assertionsassert;
assert.notHasChildren(node)
Checks that the given node
does not have any child nodes.
assert;
assert.hasChild(node, index, [criteria])
Check if the given node
at a given zero-indexed index
has the corresponding
child
, using the following criteria
:
- When a
Function
, it will runcriteria
, passing the child node as an argument.criteria
is expected to throw an error if the node is invalid. - Otherwise, it will do a deep comparison between the child node and the criteria.
var node = <ul> <li>a</li> <li>b</li> <li>c</li> </ul>; // make sure a child at index 0 existsassert; // do a deep comparison on the child at index 0assert; // run other assertions on the child nodeassert
utils.mount
mount(node)
Mount a Deku node to the DOM and return an object with a property element
containing a reference to the rendered DOM element and a property unmount
containing a function to remove the rendered DOM element from the DOM.
mountedNode.unmount()
Remove the rendered element from the DOM
mountedNode.element
A reference to the mounted dom element
utils.isNode
isNode(node, [type])
Returns true
if node
is a valid Deku node. If type
is specified, it will ensure that type is strictly equal. (whether that is a Component
or a String
element name)
utils.findAll
findAll(node, fn)
Returns an array of items found within node
that satisfy fn
.
utils.findWithClass
findWithClass(node, class)
Returns a single node found within node
that has class
. This will throw an error if more than one node is found.
utils.findAllWithClass
findAllWithClass(node, class)
Returns an array of nodes found within node
that have class
.
License
MIT