web-dev-qa-db-ja.com

カルマユニットテスト中に画像の404警告を修正する方法

Grunt/karma/phantomjs/jasmineを使用して、ディレクティブの1つ(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を変更せずに、見たいので)

75

それは、カルマを設定してロードし、要求されたときにそれらを提供する必要があるためです;)

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: [

],

// ...

あなたは一見することができます here 詳細については:)

EDIT: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

103
glepretre

私にとってパズルの紛らわしい部分は、「ベース」仮想フォルダーでした。フィクスチャのアセットパスに含める必要があることがわからない場合は、デバッグが困難になります。

As-per 構成ドキュメント

デフォルトでは、すべてのアセットは 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" />

そして、私はその時点でプロキシを必要としませんでした。

16
Tom Elmore

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();
}

カルマconfにミドルウェアを適用する

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

@glepretreの答えに基づいて、空の.pngファイルを作成し、これを構成に追加して404警告を非表示にしました。

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

構成ファイルのどこかにルートパスがある場合は、次のようなものも使用できます。

proxies: {
  '/bower_components/': config.root + '/client/bower_components/'
}
2
Gucu112

修正するには、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'
}
1
Boris Yakubchik