react中使用enzyme.mount和sinon

我在網上搜了很多,但是沒找到符合我項目場景使用的,自我摸索出能用的一個小案例,可能有不太對的地方,請見諒,僅做一個記錄:  注意哦,這個主要來測componentDidmount和componentWillUnmount。

我的項目是react+eslint+ts+mocha+enzyme+chai

大部分情況下使用enzyme.shallow就夠用了,但是發現有部分需要用到enzyme.mount, 而官網寫道,使用mount最好配上jsdom

 

所以我就開始用jsdom.

1、先下載jsdom和sinon   npm install --save-dev jsdom sinon @types/sinon

2、然後從官網找到setup.js代碼,拷貝下來,放到項目中

import { JSDOM } from "jsdom";

const jsdom = new JSDOM("<!doctype html><html><body></body></html>");

const { window } = jsdom;

function copyProps(src, target) {

  Object.defineProperties(target, {

    ...Object.getOwnPropertyDescriptors(src),

    ...Object.getOwnPropertyDescriptors(target)

  });

}

global.window = window;

global.document = window.document;

global.navigator = {

  userAgent: "node.js"

};

global.requestAnimationFrame = function(callback) {

  return setTimeout(callback, 0);

};

global.cancelAnimationFrame = function(id) {

  clearTimeout(id);

};

copyProps(window, global);

 

3、在package.json中配置mocha 和jsdom  在scripts裏面

 

 

4、然後使用,大概長這樣

 

 

 

 

下面是不用jsdom的,也是做一個記錄

1、首先下載sinon 

npm i sinon @types/sinon --save-dev

2、然後在你的測試中引入sinon

import * as sinon from "sinon";

 3、測試用例(我主要用的是chai+mocha,所以要注意相關配置提前配好)

describe("life-cycle functions in component", function() {
  let wrapper;
  const wrapperProps = getProps();
  beforeEach(function() {
    wrapper = enzyme.mount(
      <Event
        loggerFactory={wrapperProps.loggerFactory}
        eventProvider={wrapperProps.EventProvider.object}
      />
    );
  });
  afterEach(function() {
    wrapper.unmount();
  });
  // component Did mount
  it("frame has invoked life-cycle function componentDidMount", function() {
    const wrappers = wrapper.instance();
    const callbacks = sinon.spy(wrappers, "componentDidMount");
    wrapper.update();
    expect(callbacks.calledOnce);
    sinon.restore();
  });
  // component will unmount
  it("frame has invoked life-cycle function componentWillUnmount", function() {
    const wrappers = wrapper.instance();
    const callbacks = sinon.spy(wrappers, "componentWillUnmount");
    wrapper.update();
    expect(callbacks.calledOnce);
    sinon.restore();
  });
});

 

參考文章

關於測私有方法  

關於jsdom

mount和shallow的區別和使用推薦

使用enzyme和sinon調用react組件上自定義的方法

sinon 的使用(spy,stub,mock)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章