【问题标题】:how to test react native code with jest and mock for firebase如何用 jest 和 mock 测试 react native code for firebase
【发布时间】:2020-04-10 21:50:28
【问题描述】:

我正在尝试使用 jest 测试 react native 方法,我的问题是修改后的值与预期值不同。因为该函数使用了firebase,所以我做了模拟 所以这是我想使用的方法

 insertUserAction= async  ()=>{
 console.log("inside inserUserAction")
 var userActionKey =firebase.database().ref().child('userActions').push().key;
 firebase.database().ref('userActions/'+userActionKey).set(
  {

  userID: firebase.auth().currentUser.uid,
  ActionID:'001',
  time:new Date().getHours(),
  day:moment().format('dddd'),
  Repetition:'1',
  inRoutine:'0',
  insertedDate: new Date().getFullYear()+'/'+new Date().getMonth()+'/'+new Date().getDate(),
  })

  .then(() => {
    console.log("enter then");

    this.setState(() =>{
      return {
      userID:firebase.auth().currentUser.uid,
      ActionID:'001',
      time:new Date().getHours(),
      day:moment().format('dddd'),
      Repetition:'1'}
    });
      console.log('inserted')
  }).catch((error)=>{
      console.log(error)
  });
 }

这里是firebase配置

   const firebaseConfig = {


  apiKey: "******",
  authDomain: "*****",
  databaseURL: "*****",
  projectId: "*****",
  storageBucket: "*******",
  messagingSenderId: "******",
  appId: "*****",
  };

这里是测试

    import React from 'react';
    import HomeScreen from     '../screens/HomeScreen';

   import renderer from 'react-test-renderer';

  jest.mock("firebase/app", () => {
  const data = { ActionID: "unnamed" };
  const snapshot = { val: () => data };
  return {
    firebaseConfig: jest.fn().mockReturnValue({
    database: jest.fn().mockReturnValue({
      ref: jest.fn().mockReturnThis(),
      once: jest.fn(() => Promise.resolve(snapshot))
    })
  })
};
 });

test('testing Analysis feature ', () => {
 const component = renderer.create(<HomeScreen ActionID="5" />);
 const instance = component.getInstance();
 instance.insertUserAction();
 expect(instance.state.ActionID).toBe("001");
  });

我不确定模拟

【问题讨论】:

  • 你正在使用firebase.auth(),所以你也应该模拟那个方法,也许很难模拟这个库,你可能可以使用一些firebase模拟库,也许是firebase-mock npm包可以帮助您做到这一点,
  • 即使我删除了 firebase.auth() 也没有用
  • 那是因为你也在使用其他方法,比如 child、push、set,所以要小心你需要模拟什么来让你的测试工作
  • 你能不能给我看看锄头来模拟这些函数?

标签: javascript firebase react-native jes


【解决方案1】:

正如你所看到的,没有必要模拟 firebaseConfig,因为这只需要连接到真实的数据库,但为了模拟目的,它不需要,所以基本上你只需要模拟你真正需要的东西,在这种情况下你需要这样的东西:

jest.mock("firebase/app", () => {
  const data = { ActionID: "unnamed" };
  const snapshot = { val: () => data };
  return {
    firebaseConfig: jest.fn().mockReturnValue({}),
    auth: jest.fn().mockReturnValue({ currentUser: { uid: 'uid' } }),
    database: jest.fn().mockReturnValue({
      ref: jest.fn().mockImplementation(() => ({
        child: jest.fn().mockImplementation(() => ({
          push: jest.fn().mockReturnValue({
            key: 'someValueAsKey'
          })
        })),
        set: jest.fn(),
      })),
      once: jest.fn(() => Promise.resolve(snapshot))
    })
  };
});

我保留了 firebaseConfig 模拟,因为我不想删除您的代码,如果您愿意,可以将其删除。

请记住,您可以使用一些 firebase 模拟库,例如 https://www.npmjs.com/package/firebase-mock

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 2020-07-17
    • 2018-09-07
    • 2018-02-09
    • 1970-01-01
    • 2020-06-01
    • 2021-09-20
    • 2020-10-26
    • 2022-06-11
    • 2016-07-22
    相关资源
    最近更新 更多