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

Karma结合Jasmine测试three.js代码时,URL加载STL测试数据失败求助

解决Karma+Jasmine测试three.js时STL文件加载失败的问题

嘿,我来帮你搞定这个头疼的加载问题!虽然你直接访问那个URL没问题,但Karma的运行环境和普通浏览器访问本地文件的逻辑不一样,咱们一步步排查:

1. 先检查Karma的配置是否托管了测试数据文件

Karma有自己的内置服务器,默认只会加载你明确指定的文件。所以即使你的STL文件在本地能访问,Karma的服务器可能根本没把这个路径映射进去。

解决方案:修改karma.conf.js

有两种方式配置:

方式一:使用代理(Proxies)

在配置文件里添加代理规则,把你的测试数据路径映射到Karma的根路径(默认是/base/):

module.exports = function(config) {
  config.set({
    // 其他配置...
    proxies: {
      '/tests/testdata/': '/base/tests/testdata/'
    },
    // 其他配置...
  });
};

之后把你的加载路径改成相对路径:'/tests/testdata/cube_big.stl',这样Karma会自动代理到正确的文件位置。

方式二:直接把STL文件加入托管列表

在files数组里添加测试数据文件,告诉Karma要提供这些文件的访问:

module.exports = function(config) {
  config.set({
    // 其他配置...
    files: [
      // 你的测试文件、three.js依赖等...
      { 
        pattern: 'tests/testdata/**/*.stl', 
        included: false, // 不要当作JS脚本引入
        served: true,    // 让Karma服务器托管这些文件
        watched: true    // 文件变化时重新加载(可选)
      }
    ],
    // 其他配置...
  });
};

2. 避免CORS跨域问题

你之前用的是绝对URL http://localhost/tests/testdata/cube_big.stl,但Karma默认运行在9876端口(如果没改的话),而你平时访问的localhost可能是80端口,这就会触发跨域限制。

解决办法:放弃绝对URL,改用上面配置后的相对路径,让请求走Karma自己的服务器,就不会有跨域问题了。

3. 确保异步测试的错误分支正确处理

你用了beforeAll(done)来处理异步加载,但如果加载失败,错误回调里没有调用done()相关方法,Karma会一直等待超时,反而掩盖了真实的错误原因。

修改你的测试代码,在错误回调里调用done.fail():

beforeAll(function(done) {
  var loader = new THREE.STLLoader();
  loader.load(
    '/tests/testdata/cube_big.stl', // 改用相对路径
    function (geo) {
      // 你的业务处理代码
      done(); // 加载成功时通知Karma
    },
    function(e){
      console.log("加载进度:", e);
    },
    function(e){
      console.log("加载错误详情:", e);
      done.fail("STL文件加载失败: " + (e.message || e)); // 通知Karma测试失败,并传递错误信息
    }
  );
});

按照这几步调整后,应该就能正常加载STL文件进行测试了!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:42:17