Let’s take a look at examples/element-factory/src/secret-input.test.js again. We have some functionality where the input field can be pre-populated with whatever is currently in localStorage. Let’s say that we want to both stub the value of localStorage and also be able to introspect the parameters that localStorage.getItem was called with.
Let’s start by modifying our setup:
beforeEach(() => {
vi.spyOn(localStorage, 'getItem').mockReturnValue('test secret');
vi.spyOn(localStorage, 'setItem');
document.body.innerHTML = '';
document.body.appendChild(createSecretInput());
});Now, let’s say that we want to take a look at whether or not the input has the correct value and if it was pulling that value from localStorage.
it('should have loaded the secret from localStorage', async () => {
expect(screen.getByLabelText('Secret')).toHaveValue('test secret');
expect(localStorage.getItem).toHaveBeenCalledWith('secret');
});Yea, probably. We could. And, maybe we should. The only added advantage here is
that we can look at the values that localStorage.getItem and localStorage.setItem were called with.
To be totally transparent, I am mostly doing this because I’m going to have you take on more practical examples in a hot minute.
We can also do the same for setting the value. Bear in mind, since the secret is loaded from localStorage, you’ll need to clear out the input field before typing into it.
it('should save the secret to localStorage', async () => {
const input = screen.getByLabelText('Secret');
const button = screen.getByText('Store Secret');
await userEvent.clear(input);
await userEvent.type(input, 'new secret');
await userEvent.click(button);
expect(localStorage.setItem).toHaveBeenCalledWith('secret', 'new secret');
});Your Turn
Head over to examples/guessing-game. This game uses Math.random to come up with
a random number—which could make it hard to test. Can you use the strategies above
to keep Math.random() in a fixed place? Hint: 0.5 is a good choice.
You can see an example solution here.
Further Reading
You can review some more examples here.