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

Jea*_*eri 79 javascript unit-testing http-status-code-404 angularjs karma-runner

我使用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();
    }));
    ....
});
Run Code Online (Sandbox Code Playgroud)

但我确实得到了这些404

WARN [web-server]: 404: /img1.png
WARN [web-server]: 404: /img2.png
...
Run Code Online (Sandbox Code Playgroud)

虽然它们什么也不做,但它们确实会给日志输出增加噪音.有没有办法来解决这个问题 ?(当然,不改变业力的logLevel,因为我确实希望看到它们)

gle*_*tre 105

那是因为你需要将业力配置为加载然后在请求时提供它们;)

在你的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: [

],

// ...
Run Code Online (Sandbox Code Playgroud)

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

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

proxies: {
  '/path/to/img/': 'http://localhost:8000/path/to/img/'
},
Run Code Online (Sandbox Code Playgroud)

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

proxies =  {
  '/images/': '/base/images/'
};
Run Code Online (Sandbox Code Playgroud)

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

  • 在我的情况下,这些图像不存在.您提供的解决方案假定文件存在,对吧? (4认同)
  • 如果你在自定义端口上运行业力,你可以通过链接到业力服务器的完整URI来避免404 :(假设`port:9999`)```proxies = {'/ images /':'http :// localhost:9999/base/images /'};``` (3认同)
  • 我发现 ''/images/': ''` 实际上足以抑制警告,并且不需要设置文件。 (3认同)

Tom*_*ore 16

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

根据配置文档

默认情况下,所有资产都在http:// localhost:[PORT]/base /中提供

注意:对于其他版本可能不是这样 - 我在0.12.14并且它对我有用,但0.10文档不提及它.

指定文件模式后:

{ pattern: 'Test/images/*.gif', watched: false, included: false, served: true, nocache: false },
Run Code Online (Sandbox Code Playgroud)

我可以在我的夹具中使用它:

<img src="base/Test/images/myimage.gif" />
Run Code Online (Sandbox Code Playgroud)

那时我不需要代理.


the*_*rel 9

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

proxies: {
  '/img/generic.png': 'test/assets/img/generic.png'
}
Run Code Online (Sandbox Code Playgroud)


小智 9

您可以在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'
  }
};
Run Code Online (Sandbox Code Playgroud)

然后定义中间件功能:

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();
}
Run Code Online (Sandbox Code Playgroud)

在你的业力conf中应用中间件

{
    basePath: '',
    frameworks: ['jasmine', '@angular/cli'],
    middleware: ['surpassImage404sMiddleware'],
    plugins: [
      ...
      {'middleware:surpassImage404sMiddleware': ['value', surpassImage404sMiddleware]}
    ],
    ...
}
Run Code Online (Sandbox Code Playgroud)


Jef*_*eff 5

尽管这是一个旧线程,但我花了几个小时才真正让我的图像真正从业力中得到服务,以消除 404。评论不够彻底。我相信我可以用这个屏幕截图阐明解决方案。本质上,许多评论缺少的一件事是代理值必须以 "/base" 开头,即使 base 不在我的任何文件夹路径中,也不在我的请求中。

(没有正斜杠的“base”导致 karma 返回 400 BAD REQUEST)

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

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

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

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