Continuo recebendo "localStorage não está definido" nos testes do Jest, o que faz sentido, mas quais são minhas opções? Bater nas paredes de tijolos.
144
Ótima solução de @chiedo
No entanto, usamos a sintaxe do ES2015 e achei que era um pouco mais limpo escrevê-lo dessa maneira.
class LocalStorageMock {
constructor() {
this.store = {};
}
clear() {
this.store = {};
}
getItem(key) {
return this.store[key] || null;
}
setItem(key, value) {
this.store[key] = value.toString();
}
removeItem(key) {
delete this.store[key];
}
};
global.localStorage = new LocalStorageMock;
value + ''
na setter como nulo alça e valores indefinidos corretamente|| null
é por isso que meu teste estava falhando, porque no meu teste eu estava usandonot.toBeDefined()
. @Chiedo solução fazê-lo funcionar novamenteDescobri isso com a ajuda do seguinte: https://groups.google.com/forum/#!topic/jestjs/9EPhuNWVYTg
Configure um arquivo com o seguinte conteúdo:
Então você adiciona a seguinte linha ao seu package.json nas configurações do Jest
"setupTestFrameworkScriptFile":"PATH_TO_YOUR_FILE",
fonte
"setupFiles": [...]
funciona também. Com a opção de matriz, permite separar simulações em arquivos separados. Por exemplo:"setupFiles": ["<rootDir>/__mocks__/localStorageMock.js"]
getItem
difere um pouco do que seria retornado por um navegador se nenhum dado for definido em uma chave específica. chamargetItem("foo")
quando não está definido retornará, por exemplo,null
em um navegador, masundefined
com essa simulação - isso estava causando a falha de um dos meus testes. Solução simples para mim era voltarstore[key] || null
nagetItem
funçãolocalStorage['test'] = '123'; localStorage.getItem('test')
Se estiver usando create-react-app, há uma solução mais simples e direta explicada na documentação .
Crie
src/setupTests.js
e coloque isso nele:Tom Mertz contribuição em um comentário abaixo:
Em seguida, você pode testar se as funções do seu localStorageMock são usadas fazendo algo como
dentro de seus testes, se você quiser ter certeza de que foi chamado. Confira https://facebook.github.io/jest/docs/en/mock-functions.html
fonte
localStorage
você usa no seu código. (se você usacreate-react-app
e todos os scripts automáticos que fornece naturalmente)expect(localStorage.getItem).toBeCalledWith('token')
ouexpect(localStorage.getItem.mock.calls.length).toBe(1)
dentro dos testes, se você quiser ter certeza de que foi chamado. Confira facebook.github.io/jest/docs/en/mock-functions.htmllocalStorage
? Você não gostaria de redefinir os espiões após cada teste para evitar a "propagação" em outros testes?Atualmente (outubro de 19), o localStorage não pode ser ridicularizado ou espionado pelo gracejo, como você faria normalmente, e conforme descrito nos documentos de criação e reação de aplicativos. Isso ocorre devido a alterações feitas no jsdom. Você pode ler sobre isso nos rastreadores de brincadeiras e jsdom .
Como solução alternativa, você pode espionar o protótipo:
fonte
jest.spyOn(window.localStorage.__proto__, 'setItem');
ou você apenas pega um pacote simulado como este:
https://www.npmjs.com/package/jest-localstorage-mock
Ele lida com não apenas a funcionalidade de armazenamento, mas também permite testar se a loja foi realmente chamada.
fonte
Uma alternativa melhor que lida com
undefined
valores (não possuitoString()
) e retornanull
se o valor não existir. Testei isso com areact
v15redux
eredux-auth-wrapper
fonte
removeItem
: developer.mozilla.org/pt-BR/docs/Web/API/Storage/removeItemSe você está procurando um mock e não um stub, aqui está a solução que eu uso:
Exporto os itens de armazenamento para facilitar a inicialização. IE eu posso facilmente configurá-lo para um objeto
Nas versões mais recentes do Jest + JSDom, não é possível definir isso, mas o armazenamento local já está disponível e você pode espioná-lo da seguinte forma:
fonte
Encontrei esta solução no github
Você pode inserir esse código em seus setupTests e deve funcionar bem.
Eu testei em um projeto com tip typtipt.
fonte
Infelizmente, as soluções que encontrei aqui não funcionaram para mim.
Então, eu estava olhando para os problemas do Jest GitHub e encontrei este tópico
As soluções mais votadas foram as seguintes:
fonte
window
ouStorage
definiram. Talvez seja a versão mais antiga do Jest que estou usando.Como @ ck4, a documentação sugerida tem uma explicação clara para o uso
localStorage
em tom de brincadeira. No entanto, as funções simuladas falharam ao executar qualquer um doslocalStorage
métodos.Abaixo está o exemplo detalhado do meu componente react, que faz uso de métodos abstratos para escrever e ler dados,
Erro:
Fix:
Adicionar abaixo função simulada para jest (caminho:
.jest/mocks/setUpStore.js
)O snippet é referenciado a partir daqui
fonte
Apresentamos algumas outras respostas aqui para resolvê-lo em um projeto com o Typecript. Eu criei um LocalStorageMock assim:
Em seguida, criei uma classe LocalStorageWrapper que eu uso para todo o acesso ao armazenamento local no aplicativo em vez de acessar diretamente a variável de armazenamento local global. Facilitou a configuração da simulação no wrapper para testes.
fonte
Crie uma simulação e adicione-a ao
global
objetofonte
Você pode usar essa abordagem para evitar zombarias.
fonte
Você precisa simular o armazenamento local com esses trechos
// localStorage.js
E na configuração de brincadeira:
Sinta-se livre para perguntar qualquer coisa.
fonte
A solução a seguir é compatível para testes com configurações mais rigorosas do TypeScript, ESLint, TSLint e Prettier
{ "proseWrap": "always", "semi": false, "singleQuote": true, "trailingComma": "es5" }
:HT / https://stackoverflow.com/a/51583401/101290 para saber como atualizar global.localStorage
fonte
Para fazer o mesmo no texto datilografado, faça o seguinte:
Configure um arquivo com o seguinte conteúdo:
Então você adiciona a seguinte linha ao seu package.json nas configurações do Jest
"setupTestFrameworkScriptFile":"PATH_TO_YOUR_FILE",
Ou você importa esse arquivo no seu caso de teste em que deseja simular o armazenamento local.
fonte
Isso funcionou para mim,
fonte