好的,所以我有一个简单的示例React组件与sessionStorage交互:
//App.jsx
var React = require('react/addons');
var App = React.createClass({
handleSubmit: function (e) {
},
handleNameChange: function (e) {
sessionStorage.setItem('name', e.target.value);
},
render: function () {
return (
<form>
<input type='text' label='Name' onChange={this.handleNameChange}/>
<button type='submit' label='Submit' onClick={this.handleSubmit}/>
</form>
);
}
});
module.exports = App;
我用Jest写了这个测试...
//App-test.js
jest.dontMock('../App.jsx');
jest.setMock('sessionStorage', require('../__mocks__/sessionStorage.js'));
describe('App', function () {
var React = require('react/addons');
var sessionStorage = require('sessionStorage');
var App = require('../App.jsx');
var TestUtils = React.addons.TestUtils;
var testapp = TestUtils.renderIntoDocument(
<App />
);
var input = TestUtils.findRenderedDOMComponentWithTag(testapp, 'input');
it('starts with empty value for name input', function () {
expect(input.getDOMNode().textContent).toEqual('');
});
it('updates sessionStorage on input', function () {
console.log(typeof sessionStorage);
TestUtils.Simulate.change(input, {target: {value: 'Hello!'}});
expect(sessionStorage.getItem('name')).toEqual('Hello!');
});
});
我在最后一段代码片段中手动模拟了sessionStorage:
//sessionStorage.js
var sessionStorage = {
storage: {},
setItem: function (field, value) {
this.storage.field = value;
},
getItem: function (field) {
return this.storage.field;
}
};
module.exports = sessionStorage;
问题是,当我尝试运行测试时,它仍然抱怨sessionStorage未定义。即使在测试结束时调用console.log也会确认它已被定义,但错误会立即抛出到该行上。我在这里错过了什么?您可以从here克隆整个项目以查看目录结构等。
答案 0 :(得分:12)
为了在所有测试用例中解决这个问题,我使用了这个:
npm install mock-local-storage --save-dev
然后在你的,在jest配置下的package.json:
...
"jest": {
...
"setupTestFrameworkScriptFile": "mock-local-storage"
}
...
这将为所有测试用例添加模拟的localStorage和sessionStorage,您不需要在每个文件中进行更改。 您也可以将代码放在一个文件中,并在setupTestFrameworkScriptFile下指定文件位置,而不是使用npm包。
您的代码应类似于:https://github.com/letsrock-today/mock-local-storage/blob/master/src/mock-localstorage.js
答案 1 :(得分:6)
我也没有注入sessionStorage。 我能够在beforeEach函数上模拟全局变量:
beforeEach(function() {
...
global.sessionStorage = jest.genMockFunction();
global.sessionStorage.setItem = jest.genMockFunction();
global.sessionStorage.getItem = jest.genMockFunction();
...
}
答案 2 :(得分:0)
从Vishal提交开始,我安装了软件包:
npm install mock-local-storage --save-dev
但是我的设置有些不同,所以我将等效项添加到了jest.config.js
文件中:
...
setupFiles: [
"mock-local-storage",
...
]
...
这似乎解决了我的问题。希望这会有所帮助。
答案 3 :(得分:0)
采用@afcastano 解决方案
如果您想监视存储并检查值
beforeEach(function () {
...
jest.spyOn(window.sessionStorage, 'setItem');
...
}
it('check storage value', () => {
expect(window.sessionStorage.setItem).toHaveBeenCalledWith('storage-key', 'storage-value');
});