如何在玩笑中模拟函数内的变量

dek*_*eko 10 reactjs jestjs enzyme

我想开玩笑地测试“canViewPage”方法。如何模拟 const userPages 这是来自 func getUserPage 的值

   canViewPage(page){
     const userPages = getUsersPages();
    if(userPages.includes(page)){
      return true;
    }
    return false;
   }


  getUsersPages(){
    // here i hardcode a list of pages, for simplicity purposes
    const pages = ['home','about','contact'];
    return pages

  }



Run Code Online (Sandbox Code Playgroud)

这是我尝试过的

test('test canViewPage', () => {
    const spy = jest.spyOn(canViewPage, 'userPages');
    spy.mockReturnValue(['home','about','contact']);

    expect(canViewPage('premiumPage')).toBe(false); 

    spy.mockRestore();
  });
Run Code Online (Sandbox Code Playgroud)

我也尝试过这个

test('test canViewPage', () => {
    const spy = jest.spyOn(canViewPage, 'getUsersPage');
    spy.mockReturnValue(['home','about','contact']);

    expect(canViewPage('premiumPage')).toBe(false); 

    spy.mockRestore();
  });
Run Code Online (Sandbox Code Playgroud)

mac*_*ips 12

要嘲笑 的价值,userPages你必须嘲笑getUserPage。要实现这一点,取决于 和getUserPagecanViewPage定义位置和方式。我假设这两个函数是在类中定义的MyAwesomeClass

// MyAwesomeClass.js
export default class MyAwesomeClass {
  canViewPage(page) {
    const userPages = this.getUsersPages();
    if (userPages.includes(page)) {
      return true;
    }
    return false;
  }


  getUsersPages() {
    // here i hardcode a list of pages, for simplicity purposes
    const pages = ['home', 'about', 'contact'];
    return pages;
  }
}

// test.js
import MyAwesomeClass from '<path to MyAwesomeClass.js>'
test('test canViewPage', () => {
  const instance = new MyAwesomeClass()
  const spy = jest.spyOn(instance, 'getUsersPages');
  spy.mockReturnValue(['mockItem1','mockItem2','mockItem3']);

  expect(instance.canViewPage('premiumPage')).toBe(false);
  expect(instance.canViewPage('mockItem1')).toBe(true);

  spy.mockRestore();
});
Run Code Online (Sandbox Code Playgroud)

如果canViewPagegetUsersPages是类中的静态方法,则以不同的方式进行模拟

test('test canViewPage', () => {
  const spy = jest.spyOn(MyAwesomeClass, 'getUsersPages');
  spy.mockReturnValue(['mockItem1','mockItem2','mockItem3']);

  expect(MyAwesomeClass.canViewPage('premiumPage')).toBe(false);
  expect(MyAwesomeClass.canViewPage('mockItem3')).toBe(true);

  spy.mockRestore();
});
Run Code Online (Sandbox Code Playgroud)

  • 如果没有类并且“getUsersPages”只是该文件中的方法怎么办? (2认同)