在业力单元测试期间如何修复图像的404警告


84

我正在使用grunt / karma / phantomjs / jasmine对我的指令之一(angularjs)进行单元测试。我的测试运行正常

describe('bar foo', function () {
    beforeEach(inject(function ($rootScope, $compile) {
        elm = angular.element('<img bar-foo src="img1.png"/>');
        scope = $rootScope.$new();
        $compile(elm)();
        scope.$digest();
    }));
    ....
});

但我确实得到了这些404

WARN [web-server]: 404: /img1.png
WARN [web-server]: 404: /img2.png
...

尽管它们什么也不做,但是它们确实会在日志输出中增加噪音。有没有办法解决这个问题 ?(当然,无需更改业力的logLevel,因为我确实希望看到它们)


它是否可以在其他浏览器中保留?我知道FF中的此类呼叫存在一些404错误的已知问题。
Nicholas Hazel 2014年

它必须是phantomjs。我检查了也显示404的Chrome。请注意,它们是警告,不是错误!
Jeanluca Scaljeri 2014年

使用ng-src有帮助吗?
Eitan Peer 2014年

不错的尝试,但结果相同
Jeanluca Scaljeri 2014年

Answers:


109

那是因为您需要配置业力以进行加载,然后在需要时为它们提供服务;)

在karma.conf.js文件中,您应该已经定义了文件和/或模式,例如:

// list of files / patterns to load in the browser
files : [
  {pattern: 'app/lib/angular.js', watched: true, included: true, served: true},
  {pattern: 'app/lib/angular-*.js', watched: true, included: true, served: true},
  {pattern: 'app/lib/**/*.js', watched: true, included: true, served: true},
  {pattern: 'app/js/**/*.js', watched: true, included: true, served: true},
  // add the line below with the correct path pattern for your case
  {pattern: 'path/to/**/*.png', watched: false, included: false, served: true},
  // important: notice that "included" must be false to avoid errors
  // otherwise Karma will include them as scripts
  {pattern: 'test/lib/**/*.js', watched: true, included: true, served: true},
  {pattern: 'test/unit/**/*.js', watched: true, included: true, served: true},
],

// list of files to exclude
exclude: [

],

// ...

您可以在这里查看更多信息:)

编辑:如果您使用nodejs Web服务器来运行您的应用程序,则可以将其添加到karma.conf.js中:

proxies: {
  '/path/to/img/': 'http://localhost:8000/path/to/img/'
},

EDIT2:如果您不使用或不想使用其他服务器,则可以定义本地代理,但是由于Karma不提供对正在使用的端口的访问,因此,如果karma在非9876(默认)的其他端口上启动,则您仍然会得到那些烦人的404 ...

proxies =  {
  '/images/': '/base/images/'
};

相关问题:https : //github.com/karma-runner/karma/issues/872


4
就我而言,这些图像不存在。您提供的解决方案假定文件存在,对吗?
Jeanluca Scaljeri 2014年

当然是!我想我误会了,对于不存在的文件出现404错误是有意义的,对吧?您要隐藏与图像有关的警告吗?而且,如果不更改日志级别,则看不到任何解决方案会隐藏其他有风险的警告。例如,为什么不在“ test / img”文件夹中创建空的.png文件呢?:)
glepretre 2014年

由于某种原因,我无法使其正常工作。HTML中使用的URL和karma.conf.js中的模式之间到底有什么关系?例如,如果我在test / assets / img.png中有一张图片,那么网址应该是什么?
Jeanluca Scaljeri 2014年

1
抱歉,此解决方案应该有效,但我也不断收到404错误。我认为这与因果报应机制的缺乏实施有关,令我感到惊讶的是,我们是唯一获得这一成就的人。我发现了一种(有点hacky)的方法来使它工作,但是您将需要并行运行Karma来运行另一个(Web)服务器。我将编辑我的答案。;)
glepretre 2014年

3
作为对EDIT2的响应,如果您在自定义端口上运行业力,则可以通过链接到业力服务器的完整URI来避免404 :(假设port: 9999proxies = { '/images/': 'http://localhost:9999/base/images/' };
2015年

18

对我来说,令人困惑的难题是“基本”虚拟文件夹。如果您不知道需要将其包含在灯具的资产路径中,则会发现难以调试。

根据配置文档

默认情况下,所有资产都位于http:// localhost:[PORT] / base /

注意:这可能不适用于其他版本-我使用的是0.12.14,但对我有用,但0.10的文档没有提及。

指定文件模式后:

{ pattern: 'Test/images/*.gif', watched: false, included: false, served: true, nocache: false },

我可以在我的装置中使用它:

<img src="base/Test/images/myimage.gif" />

那时候我不需要代理。


这是关键。最高答案说明了这一点,但非常简短-感谢您的扩展。
jlb

10

您可以在karma.conf.js中创建通用中间件-虽然有点过头,但对我来说确实有用

首先定义虚拟的1px图像(我使用过base64):

const DUMMIES = {
  png: {
    base64: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==',
    type: 'image/png'
  },
  jpg: {
    base64: 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAABAAEDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iiigD//2Q==',
    type: 'image/jpeg'
  },
  gif: {
    base64: 'data:image/gif;base64,R0lGODlhAQABAAAAACwAAAAAAQABAAA=',
    type: 'image/gif'
  }
};

然后定义中间件功能:

function surpassImage404sMiddleware(req, res, next) {
  const imageExt = req.url.split('.').pop();
  const dummy = DUMMIES[imageExt];

  if (dummy) {
    // Table of files to ignore
    const imgPaths = ['/another-cat-image.png'];
    const isFakeImage = imgPaths.indexOf(req.url) !== -1;

    // URL to ignore
    const isCMSImage = req.url.indexOf('/cms/images/') !== -1;

    if (isFakeImage || isCMSImage) {
      const img = Buffer.from(dummy.base64, 'base64');
      res.writeHead(200, {
        'Content-Type': dummy.type,
        'Content-Length': img.length
      });
      return res.end(img);
    }
  }
  next();
}

在业力配置中应用中间件

{
    basePath: '',
    frameworks: ['jasmine', '@angular/cli'],
    middleware: ['surpassImage404sMiddleware'],
    plugins: [
      ...
      {'middleware:surpassImage404sMiddleware': ['value', surpassImage404sMiddleware]}
    ],
    ...
}

您是否曾经将其包装成实际的包装?我只想npm安装它
Akxe,

如果要抑制所有图像请求,只需检查req.headers.accept它是否包含image,如果包含则返回204。
cleong

9

基于@glepretre的答案,我创建了一个空的.png文件并将其添加到配置中以隐藏404警告:

proxies: {
  '/img/generic.png': 'test/assets/img/generic.png'
}

3

要解决此问题,请karma.conf.js确保使用代理指向所提供的文件:

files: [
  { pattern: './src/img/fake.jpg', watched: false, included: false, served: true },
],
proxies: {
  '/image.jpg': '/base/src/img/fake.jpg',
  '/fake-avatar': '/base/src/img/fake.jpg',
  '/folder/0x500.jpg': '/base/src/img/fake.jpg',
  '/undefined': '/base/src/img/fake.jpg'
}

3

尽管它是一个旧线程,但我花了几个小时才真正将我的图像从因果报应中删除,以消除404。评论还不够彻底。我相信我可以通过此屏幕截图阐明解决方案。本质上,缺少许多注释的一件事是,代理值必须以“ / base”开头,即使base不在我的任何文件夹路径中,也不在我的请求中。

(没有正斜杠的“基本”结果导致业力返回400错误请求)

现在,在运行ng test之后,我可以从以下网址成功提供“ ./src/assets/favicon.png”:http:// localhost:9876 / test / dummy.png

在我的项目中,我使用以下npm软件包版本:

  • 业力v4.3.0
  • 茉莉花芯v3.2.1
  • 业力茉莉v1.1.2
  • @ angular / cli v8.3.5
  • 角度v8.2.7

具有karma.conf.js资产位置的VSCode项目结构


这种见解特别有助于我理解,从基础区域的角度来看,服务于基础区域内的文件和基础区域之外的文件(从根本上是我的问题)之间存在差异(从Karma的角度来看),这使我进入github.com/karma。 -runner / karma / issues / 2703。因此,感谢您的澄清。
dpmott

2

如果您在配置文件中的某个位置具有根路径,则还可以使用以下命令:

proxies: {
  '/bower_components/': config.root + '/client/bower_components/'
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.