chai-shallowly
一個用於 Enzyme 的 Chai 斷言外掛。這個斷言外掛的目標是讓您可以使用類似 Chai 的語法搭配 Enzyme。
語法看起來像這樣
let component = <Foo />;
expect(component).to.shallowly.haveClass("this-is-a-class");
如果您想淺層渲染某些東西並使用此 API,您必須包含關鍵字 shallowly
。其餘的應該會如您預期般運作。
注意: 這不會更改 Chai 的上下文。 expect(component).to.shallowly.be.ok
將會針對 `component` 進行檢查,而不是其淺層版本。這是一個刻意的設計選擇。
與 Karma 和 Webpack 的整合
Enzyme 目前不預期被打包到一個大型檔案中。這會導致 Karma 和 Webpack 出現問題。您可能會看到數百個幾乎沒有意義的錯誤訊息,歸結起來就是以下幾點
- Webpack 預期會宣告一些全域變數。
- Webpack 需要不要解析 sinon,而是直接匯入它。
這是我們使用的配置(您可以在原始碼中查看完整配置)
externals: {
jsdom: "window",
cheerio: "window",
"react/lib/ExecutionEnvironment": true,
"react/lib/ReactContext": true
},
resolve: {
alias: {
sinon: require.resolve("sinon/pkg/sinon")
}
},
module: {
noParse: [
/node_modules\/sinon\//
]
}
如果您希望 Enzyme (和 chai-enzyme) 與 Karma 和 Webpack 一起運作,您需要將這些添加到您的僅限測試的配置中。
API
您可以查看測試以獲得更明確的覆蓋範圍和用法。在這裡我將介紹我們目前已完成的工作。
// hasClass
expect(shallow(component).hasClass("class")).to.be.true;
expect(component).to.shallowly.haveClass("class");
// text
expect(shallow(component).text()).to.equal("text");
expect(component).to.shallowly.have.text().equal("text");
// is
expect(shallow(component).is("div")).to.be.true;
expect(component).to.shallowly.match("div");
// type
expect(shallow(component).type("div")).to.be.true;
expect(component).to.shallowly.have.type("div");
// find
expect(shallow(component).find(".foo")).to.have.length(2);
expect(component).to.shallowly.find(".foo").to.have.length(2);
// filter
expect(shallow(component).find(".foo").filter(".bar")).to.have.length(1);
expect(component).to.shallowly.find(".foo").filter(".bar").to.have.length(1);
// not
expect(shallow(component).find(".foo").not(".bar")).to.have.length(1);
expect(component).to.shallowly.find(".foo").without(".bar").to.have.length(1);
// contains
expect(shallow(component).contains("div")).to.be.true;
expect(component).to.shallowly.containJSX("div");
// state
expect(shallow(component).state(state)).to.eql({"foo": "bar"});
expect(component).to.shallowly.have.state(state).eql({"foo": "bar"});
// props
expect(shallow(component).instance().props(propKey)).to.eql(propValue);
expect(component).to.shallowly.have.props(propKey).eql(propValue);
// simulate
/* all of this */
var shallowComponent = shallow(component);
shallowComponent.simulate("click");
expect(shallowComponent.state()).to.eql({"state":"clicked"});
/* vs */
expect(component).to.shallowly.on("click").have.state().eql({"state":"clicked"});
// setState / setProps
var shallowComponent = shallow(component);
shallowComponent.setState(state);
expect(shallowComponent.state()).to.equal(state);
expect(component).to.shallowly.withState(state).to.have.state().equal(state);