카르마 단위 테스트 중 이미지에 대한 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
...

아무것도하지 않지만 로그 출력에 노이즈를 추가합니다. 이 문제를 해결할 방법이 있습니까? (당연히 karma의 logLevel을 변경하지 않고,보고 싶습니다.)


다른 브라우저에서도 지속됩니까? FF에서 이러한 유형의 호출에 대해 404 오류와 관련된 몇 가지 알려진 문제가 있음을 알고 있습니다.
— Nicholas Hazel

phantomjs 여야합니다. 404도 표시되는 Chrome을 확인했습니다. 이는 오류가 아니라 경고입니다.
— Jeanluca Scaljeri 2014 년

ng-src를 사용하면 도움이됩니까?
— Eitan Peer

좋은 시도하지만,이 같은 결과가
— Jeanluca Scaljeri에게

답변:


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 웹 서버를 사용하여 앱을 실행하는 경우 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

물론 이죠! 내가 오해했다고 생각합니다. 존재하지 않는 파일에 대해 404 오류가 발생하는 것이 합리적입니까? 이미지와 관련된 경고를 숨기시겠습니까? 로그 수준을 변경하지 않으면 위험 할 수있는 다른 경고를 숨기는 해결책이 없습니다. 예를 들어 "test / img"폴더에 빈 .png 파일을 생성하지 않는 이유는 무엇입니까? :)
— glepretre 2014 년

어떤 이유로 나는 그것을 작동시킬 수 없습니다. HTML에 사용 된 URL과 karma.conf.js의 패턴 사이의 관계는 정확히 무엇입니까? 예를 들어 test / assets / img.png에 이미지 가있는 경우 URL은 무엇입니까?
— Jeanluca Scaljeri

1
죄송합니다.이 솔루션은 작동하지만 404 오류도 계속 발생합니다. 나는 이것이 Karma의 구현 부족과 관련이 있다고 생각하며 우리가 그것을 얻는 유일한 사람이라는 것에 놀랐습니다. 이 작업을 수행하는 (비트 해킹) 방법을 찾았지만 Karma와 병렬로 다른 (웹) 서버를 실행해야합니다. 내 대답을 수정하겠습니다. ;)
— glepretre 2014 년

3
EDIT2에 대한 응답으로 사용자 지정 포트에서 karma를 실행하면 karma 서버의 전체 URI에 연결하여 404를 피할 수 있습니다. (가정 port: 9999)proxies = { '/images/': 'http://localhost:9999/base/images/' };
— Josh

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

Karma conf에 미들웨어 적용

{
    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"로 시작해야 한다는 사실입니다 .

(슬래시가없는 "base"는 카르마가 400 BAD REQUEST를 반환 함)

이제 ng test를 실행 한 후 다음 URL에서 "./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/'
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.