ĺ°ç¨ĺşĺĺ ćľčŻ
ĺ°ç¨ĺşçćľčŻĺwebĺşç¨ćľčŻĺşĺŤä¸ĺ¤§ďźĺŻäťĽĺŠç¨jestčżčĄćľčŻďźä˝ćŻçąäşjestĺŞćäžäşnodejsĺćľč§ĺ¨ć§čĄçŻĺ˘ďźĺ ć¤ĺ°ç¨ĺşçapić䝏éčŚmockďźä¸é˘čŽ˛č§Łĺ°ç¨ĺşćľčŻçä¸äşmockć塧ă
mockĺ°ç¨ĺşAPI
ć䝏ćľčŻĺ°ç¨ĺşćśďźçťĺ¸¸äźč°ç¨ĺžŽäżĄapiďźäžĺŚwx.showLoadingćšćłďźä˝ćŻĺ 为ć䝏çć§čĄçŻĺ˘ćŞĺŽäščŻĽćšćłďźäźĺşç°č°ç¨é误ă
ć䝏ĺŻäťĽéčżjestćäžçglobalčŽžç˝Žĺ ¨ĺąĺéďźĺŻäťĽĺ¨ćľčŻćäťśä¸ĺçŹçźĺďźćč ĺ¨package.jsonçjestĺ莞罎setupFilesĺąć§ďźčŽŠjestčŞĺ¨ĺ č˝˝ă
 "jest": {   "setupFiles": ["./__tests__/wx.js"]
 },ĺ¤ĺśäťŁç
./tests/wx.jsćäťśĺ 厚ĺŚä¸ďźčĄ¨ç¤şĺ°ĺ°ç¨ĺşçapićšćłĺŽäšä¸şmockćšćłă
global.wx = {
 showLoading: jest.fn(),
 hideLoading: jest.fn(),
 showModal: jest.fn(),
 request: jest.fn(),
 getStorageSync: jest.fn(),
 showShareMenu: jest.fn(),
};ĺ¤ĺśäťŁç
ćľčŻĺ°ç¨ĺşéĄľé˘
// 犺ç˝çĺ°ç¨ĺşéĄľé˘äťŁç
Page({ onLoad () {
  // your code
}
})ĺ¤ĺśäťŁç
ä¸ä¸ŞçŠşç˝çĺ°ç¨ĺşéĄľé˘ďźäťŁç äźč˘ŤPagećšćłĺ 裚ďźĺćśPageĺĺ§ĺĺďźäźć§čĄonLoadăonReadyççĺ˝ĺ¨ććšćłďźčä¸ĺ˝ĺ寚蹥čżč˝č°ç¨setDataćšćłĺŻšéĄľé˘datać°ćŽčżčĄäżŽćšă
ć䝏éčŚmock PagećšćłçĺŽç°ďźäťŁç ĺŚä¸ă
export const noop = () => {};export const isFn = fn => typeof fn === 'function';let wId = 0;
global.Page = ({ data, ...rest }) => {
 const page = {
  data,   setData: jest.fn(function (newData, cb) {
   this.data = {
    ...this.data,
    ...newData,
   };
   cb && cb();
  }),
  onLoad: noop,
  onReady: noop,
  onUnLoad: noop,
  __wxWebviewId__: wId++,
  ...rest,
 };
 global.wxPageInstance = page;  return page;
};ĺ¤ĺśäťŁç
丞个äžĺ
ĺ莞ć䝏çĺ°ç¨ĺşéĄľé˘ćŻä¸ä¸Şçľĺ˝ąĺ襨ĺąç¤şďźä¸ĺĄäťŁç ĺŚä¸ă
const filmServer = require('../../server/film.js');
Page({
 data: {
  comingFilms: [],
 },  onLoad() {
  this.getComingFilm();
 },
 // čˇĺĺłĺ°ä¸ć çľĺ˝ąĺ襨  getComingFilm() {   return filmServer.getComingSoon(1, 5).then((data) => {
   data.films.forEach((film) => {
    const displayDate = `${new Date(film.premiereAt).getMonth() + 1}ć${new Date(film.premiereAt).getDate()}ćĽ`;
    film.displayDate = displayDate;
   });
   this.setData({ comingFilms: data.films });
  });
 },
});ĺ¤ĺśäťŁç
ć䝏ççźĺ两个ćľčŻç¨äžäżčŻäťŁç çćŁçĄŽčżčĄă
1ăäżčŻonLoadćść§čĄgetComingFilmćšćłă
2ăäżčŻgetComingFilmĺćĽćć°ćŽčżčĄć źĺźĺă
import '../../pages/film'; // ĺ č˝˝éčŚćľčŻç饾é˘
// čˇĺĺ˝ĺĺĺ§ĺçpage寚蹥ďźĺçťĺŻç¨ćĽč°ç¨setDataçćšćłďźçąťäźźĺ°ç¨ĺşéĄľé˘éçthisă
const page = global.wxPageInstance;
// mockç˝çťčŻˇćą
jest.mock('../../server/film.js');
describe('çľĺ˝ąéŚéĄľ', () => {
 describe('onLoad', () => {
  beforeAll(() => {
   // spyOnĺĺŻä˝żćšćłĺ
ˇćmockĺąć§ďźĺćśä¸ĺ˝ąĺćšćłč°ç¨ă
   jest.spyOn(page, 'getComingFilm');
   // ć§čĄéĄľé˘onLoadçĺ˝ĺ¨ćă
   page.onLoad();
  });
  it('should getComingFilm', () => {
   // ćč¨onLoadĺďźćŻĺŚć§čĄäşgetComingFilmćšćłăĺ 为ć䝏ĺé˘ĺˇ˛çťĺ°getComingFilmčżčĄspyOnäşďźć䝼ĺŻäťĽć§čĄtoBeCalledĺ¤ćďźĺŚĺäźĺşéă
   expect(page.getComingFilm).toBeCalled();
  });
 });
 describe('getComingFilm', () => {
  it('should format premiereAt as MMćDDćĽ ', () => page.getComingFilm().then(() => {
    // ćč¨čˇĺć°ćŽĺďźĺĺ§ć°ćŽĺ˘ĺ displayDateĺąć§ďźć źĺźĺ为MMćDDćĽ
    expect(page.data.comingFilms[0].displayDate).toEqual('9ć12ćĽ');
   }));
 });
});ĺ¤ĺśäťŁç