You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

测试报TypeError: _ViewStore.default不是构造函数问题求助

问题解决:TypeError: _ViewStore.default is not a constructor

核心原因分析

报错的直接原因是测试代码中尝试实例化的不是ViewStore类,而是一个已经实例化的对象,同时测试环境未正确处理JourneyStore的依赖,也会间接导致类加载或构造失败。

1. 导入混淆:类 vs 实例

业务代码中,你将ViewStore类实例化后导出:

import ViewStoreClass from './ViewStore';
const ViewStore = new ViewStoreClass();

如果测试代码错误导入了这个已实例化的ViewStore变量,而非ViewStore类本身,执行new ViewStore()就会抛出“不是构造函数”的错误——因为实例对象无法被new关键字调用。

2. JourneyStore依赖未初始化

ViewStore的setCurrentPageFromJourney方法直接依赖全局的JourneyStore实例,测试环境中如果没有预先初始化这个实例,会导致类在加载或执行方法时抛出隐含错误,间接影响构造函数的正常调用(你提到注释掉JourneyStore相关代码测试就能通过,也验证了这一点)。

解决方案

方案1:修正测试中的导入逻辑

确保测试代码导入的是ViewStore类本身,而非已实例化的对象:

// 测试文件中
import ViewStore from './path/to/ViewStore'; // 导入类本身

describe('ViewStore', () => {
  let store;

  beforeEach(() => {
    store = new ViewStore(); // 正确实例化类
  });

  test('should pass', () => {
    expect(true).toBe(true);
  });
});

方案2:模拟JourneyStore依赖

由于ViewStore依赖全局的JourneyStore,测试时需要模拟这个依赖(以Jest为例):

// 测试文件顶部
jest.mock('./path/to/JourneyStore', () => ({
  journeyParams: {
    state: 'a' // 模拟需要的状态值
  }
}));

import ViewStore from './path/to/ViewStore';

describe('ViewStore', () => {
  let store;

  beforeEach(() => {
    store = new ViewStore();
  });

  test('should set correct page from journey state', () => {
    store.setCurrentPageFromJourney();
    expect(store.currentPage).toBe(PDP_VIEWS.DEVICE);
  });
});

方案3:重构依赖注入(长期优雅方案)

避免直接依赖全局实例,通过构造函数注入JourneyStore,降低耦合度:

// 修改ViewStore类
class ViewStore {
  currentPage: Stage;
  previousPageHistory: Stage[];
  private journeyStore;

  constructor(journeyStore) {
    makeAutoObservable(this);
    this.journeyStore = journeyStore;
    this.currentPage = PDP_VIEWS.DEVICE;
    this.previousPageHistory = [];
  }

  setCurrentPageFromJourney() {
    const journeyState = this.journeyStore.journeyParams.state;

    switch (journeyState) {
      case `a`:
        this.setCurrentPage = PDP_VIEWS.DEVICE;
        break;
      case `b`:
        this.setCurrentPage = PDP_VIEWS.INSURANCE;
        break;
    }
  }
}

// 业务代码中实例化时传入JourneyStore
import ViewStoreClass from './ViewStore';
import JourneyStore from './JourneyStore';
const ViewStore = new ViewStoreClass(JourneyStore);

// 测试代码中传入模拟的JourneyStore
describe('ViewStore', () => {
  let store;
  let mockJourneyStore;

  beforeEach(() => {
    mockJourneyStore = {
      journeyParams: { state: 'a' }
    };
    store = new ViewStore(mockJourneyStore);
  });

  test('should pass', () => {
    expect(true).toBe(true);
  });
});

内容的提问来源于stack exchange,提问作者user8758206

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 05:20:41