jak naprawić 404 ostrzeżenia dla obrazów podczas testów jednostek karmy

Testuję jedną z moich dyrektyw (angularjs) używając grunt / karma/phantomjs / jasmine. Moje testy przebiegają dobrze

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();
    }));
    ....
});
Ale dostaję te 404]}
WARN [web-server]: 404: /img1.png
WARN [web-server]: 404: /img2.png
...

Chociaż nic nie robią, dodają szum do wyjścia dziennika. Można to jakoś naprawić ? (nie zmieniając oczywiście logLevel karmy, ponieważ chcę je zobaczyć)

Author: Jeanluca Scaljeri, 2014-01-12

5 answers

To dlatego, że musisz skonfigurować karmę, aby załadować, a następnie obsłużyć je na żądanie;)

W Twojej karmie.conf.plik js powinieneś mieć już zdefiniowane pliki i / lub wzorce takie jak :
// 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: [

],

// ...

Możesz zajrzeć tutaj Po Więcej informacji:)

EDIT: Jeśli używasz serwera internetowego nodejs do uruchamiania aplikacji, możesz dodać to do karmy.conf.js:

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

EDIT2: Jeśli nie używasz lub chcesz użyć innego serwera, możesz zdefiniować lokalny proxy, ale ponieważ Karma nie zapewnia dostępu do używanego portu, dynamicznie, jeśli karma uruchomi się na innym porcie niż 9876( domyślnie), nadal otrzymasz te irytujące 404...

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

Tematy pokrewne: https://github.com/karma-runner/karma/issues/872

 94
Author: glepretre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-25 07:25:39

Zagmatwanym elementem układanki był dla mnie wirtualny folder "base". Jeśli nie wiesz, że musi być uwzględniony w ścieżkach zasobów Twoich urządzeń, trudno będzie debugować.

As-per dokumentacja konfiguracji

Domyślnie wszystkie aktywa są serwowane w http://localhost: [PORT] / base /

Uwaga: Może to nie być prawda dla innych wersji - jestem na 0.12.14 i to działało dla mnie, ale 0.10 docs dont mention to.

Po określeniu wzorca plików:

{ pattern: 'Test/images/*.gif', watched: false, included: false, served: true, nocache: false },
Przydałoby mi się to w mojej oprawie:
<img src="base/Test/images/myimage.gif" />
Nie potrzebowałem wtedy pełnomocnika.
 17
Author: Tom Elmore,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-25 09:48:22

Na podstawie odpowiedzi @glepretre stworzyłem pustą .plik png i dodał to do config, aby ukryć 404 Ostrzeżenia:

proxies: {
  '/img/generic.png': 'test/assets/img/generic.png'
}
 8
Author: the_karel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-09 09:41:35

Możesz stworzyć ogólne oprogramowanie pośredniczące wewnątrz swojej karmy.conf.js - trochę przesadziłem, ale zrobił to za mnie

Najpierw zdefiniuj atrapy obrazów 1px (użyłem 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'
  }
};

Następnie zdefiniuj funkcję middleware:

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

Zastosuj middleware w swojej Karma conf

{
    basePath: '',
    frameworks: ['jasmine', '@angular/cli'],
    middleware: ['surpassImage404sMiddleware'],
    plugins: [
      ...
      {'middleware:surpassImage404sMiddleware': ['value', surpassImage404sMiddleware]}
    ],
    ...
}
 3
Author: Jakub Żwirko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-14 16:47:00

Jeśli masz ścieżkę roota gdzieś w pliku konfiguracyjnym, możesz również użyć czegoś takiego:

proxies: {
  '/bower_components/': config.root + '/client/bower_components/'
}
 2
Author: Gucu112,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-15 17:43:08