я намагався написати модульний тест, використовуючи JEST для реагуючого компонента, який отримує об'єкт JSON з locaStorage в компонентній функціїWillMount,
Реакційний компонент
import React from "react";
export default class Test extends React.Component {
constructor(props) {
super(props);
this.state = {
sampJSON: null,
username: null
}
}
componentWillMount(){
this.setState({
sampJSON: JSON.parse(localStorage.getItem("JSONResponse") || "{}");
});
this.setState({
username: sampJSON.username
});
}
render(){
return(){
<div>
<h1> Hi {this.state.username} </h1>
</div>
}
}
}
а тут мій тестовий код,
import React from "react";
import sinon from "sinon";
import Testing from "./Testing.js";
import TestUtils from "react-addons-test-utils";
jest.dontMock("Testing");
jest.dontMock("sinon");
describe("Testing Testing component", () => {
var JSONData = {
"username" : "Testing",
"surName" : "surName",
"email": "test@test.com"
}
beforeEach(function() {
// window.localStorage.setItem
var spy = sinon.spy(window.localStorage, "setItem");
// You can use this in your assertions
spy.calledWith("aKey", JSONData)
});
it("renders the Testing",() => {
var stub = sinon.stub(window.localStorage, "getItem");
stub.returns(JSONData);
var testCmp = TestUtils.renderIntoDocument(<Testing />);
expect(testCmp).toBeDefined();
});
});
коли я запускаю цей тест, я отримую помилку, як показано нижче.
- SyntaxError: Unexpected token o
at Object.parse (native)
Відповіді:
1 для відповіді № 1JSONData
повинен бути a рядок містить JSON, а не об'єкт.
Інакше localStorage.getItem("JSONResponse")
повертає об'єкт. При дзвінку JSON.parse
на об'єкті об'єкт буде перетворений у рядок "[object Object]"
спочатку явно не варто JSON.
> JSON.parse({})
Uncaught SyntaxError: Unexpected token o in JSON at position 1(…)
> JSON.parse("[object Object]")
Uncaught SyntaxError: Unexpected token o in JSON at position 1(…)
Здається, найпростішим рішенням було б зателефонувати JSON.stringify
:
stub.returns(JSON.stringify(JSONData));