Cypress Stuff
Autocomplete / Intellisense
For JavaScript
Add this to the top of each of your cypress test files:
/// <reference types="cypress" />Check if you get any completions after typing cy.. If you don't see anything,
try reloading your VSCode window.
For TypeScript
If you're using TypeScript, add the following to your tsconfig.json:
{
"compilerOptions": {
"types": ["cypress"]
}
}Testing with Material UI's <Select> Component
The snippets below test the following markup:
const Example = () => {
return (
<FormControl>
<InputLabel id="number-select-label">Number</InputLabel>
<Select
data-testid="number-select"
defaultValue=""
label="Number"
labelId="number-select-label"
sx={{ width: '16rem' }}
>
<MenuItem value={10}>Ten</MenuItem>
<MenuItem value={20}>Twenty</MenuItem>
<MenuItem value={30}>Thirty</MenuItem>
</Select>
</FormControl>
)
}Plain Cypress
Warning
This method relies on adding a data-testid to the <Select>, and doesn't
best reflect how an actual user would use it.
it('should work', () => {
// Find the select using its `data-testid`
cy.get('[data-testid="number-select"]')
// alias the input for use later
.as('number-select')
// Click it
.click()
// Find the listbox that contains the options
cy.get('[role="listbox"]')
// Find the option with the value you want to click
.get('[role="option"][data-value="20"]')
// Click it
.click()
// Find the select by its alias
cy.get('@number-select')
// Check that value was selected correctly
.contains(/twenty/i)
})With @testing-library/cypress
Info
This method requires that the select have a label, where the id on the
label equals the labelId prop on the Select. It's a bit more work, but it's
probably what you'd want anyway (having a label for the <Select>) and makes
your component more accessible.
it('should work', () => {
// Find the select by its label
cy.findByLabelText(/number/i)
// alias the input for use later
.as('number-select')
// Click it
.click()
// Find the listbox that contains the options by its label text
cy.findByLabelText(/number/i, { selector: '[role="listbox"]' })
// Find the option with the value you want to click by the text that's shown
.findByText(/twenty/i, { selector: '[role="option"]' })
// Click it
.click()
// Get the select by its alias
cy.get('@number-select')
// Check that value was selected correctly
.contains(/twenty/i)
})Info
Remember to add import '@testing-library/cypress/add-commands' to
cypress/support/commands.js. See more details
here.
Run Commands
You can run any shell command using cy.exec. For example, if you want to run a
command before each test, you can add the following adjacent to your
individual test cases.
beforeEach(() => {
cy.exec('echo "this is from cypress"')
cy.visit('http://localhost:3000')
})
/** Your tests here */