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