2017-08-18 15 views
7

Mam bardzo podstawową konfigurację karma/jaśmin z jednym zestawem testów zawierającym dwa testy. Spodziewam się, że pierwszy test zakończy się niepowodzeniem, a drugi test przejdzie.Jeden test awarii powoduje awarię innych asynchronicznych testów.

describe("The system", function() { 

    it("should fail", function() { 
     expect(true).toBe(false); 
    }); 

    it("should succeed", function(done) { 
     setTimeout(function() { 
      expect(1).toBe(1); 
      done(); 
     }, 10); 
    }); 
}); 

Jednak, kiedy uruchomić te testy w przeglądarce i kliknij przycisk Debug otworzyć RUNNER Karma DEBUG, widzę oba testy braku, gdzie druga próba nie powiedzie się z komunikatem o błędzie z pierwszy Test. Regularny przebieg testu (tj. Nie w urządzeniu Karma DEBUG RUNNER) działa zgodnie z oczekiwaniami.

komunikat błędu dla drugiego badania jest:

Uncaught Expected true to be false. 
    at UserContext.<anonymous> (http://localhost:9876/base/workingspec.js:4:22) thrown 

po wyłączeniu lub usunąć pierwszy test, przejdzie pomyślnie drugi test.

Dlaczego oba testy kończą się niepowodzeniem? Dlaczego drugi test kończy się niepowodzeniem z komunikatem o błędzie pierwszego testu?


Moja konfiguracja testowa zawiera następujące pakiety/wersje:

+-- [email protected] 
+-- [email protected] 
+-- [email protected] 
+-- [email protected] 
`-- [email protected] 
+0

Mam do czynienia z tym podobnym problemem. Czuję, że to problem w module karma-jaśmin-html-reporter. Ale nie mam żadnych rozstrzygających dowodów, aby to udowodnić. –

+0

Tutaj działa: https://jsfiddle.net/DerekL/s5hzsh40/ –

+0

@MaazSyedAdeeb To była jedna z moich teorii, ale tak nie jest. Jeśli używam standardowego reportera "progress", te same błędy pojawiają się w konsoli debugowania Chrome. – Daan

Odpowiedz

1

Problem tkwi w pliku Debug.js programu Karma Debug Runner, o którym już wcześniej pisano: @user907860. Nie jest to szczególnie ważne dla Jasmine. Mam reported the issue i , który właśnie został scalony w główną gałąź Karmy, więc następna wersja powinna naprawić ten problem.

1

Na początku myślałem, że to błąd, ale po pewnym badań z genialnym DevTools Chrome wydaje się, że jest to oczekiwane zachowanie, przynajmniej przez Jasmine. Może to być jednak błąd w strukturze Karmy.

W skrócie, plik node_modules/karma/static/debug.js (która jest js-file na stronie debugowania) posiada te linie (mam Karma v1.7.0):

for (var i = 0; i < result.log.length; i++) { 
    // Throwing error without losing stack trace 
    (function (err) { 
    setTimeout(function() { 
     throw err 
    }) 
    })(result.log[i]) 
} 

Jeśli skomentować linii rzutów i zrestartować serwer karma , zobaczysz tylko komunikaty dziennika konsoli, których należy się spodziewać: najpierw NIEPOWODZENIE, następnie PASS, a następnie podsumowanie.


Bez wątpienia błąd w karmie może być w jego zachowaniu zgłaszać po każdym spec.

To, co się tutaj dzieje krok po kroku (mam wersję "jasmine-core": "^2.6.4", przynajmniej to jest w moim pliku package.json):

  1. Jasmine uruchamia pierwszą specyfikację i to się nie powiedzie;
  2. Karma zgłasza to w dzienniku i dodaje funkcję, która zgłasza błąd do stosu (zakładam, że czytelnik zna asynchroniczny model w JavaScript, jeśli nie, to musi przeczytać o tym w coś podobnego do: "Skuteczny JavaScript: 68 konkretnych sposobów na wykorzystanie mocy JavaScript "David Herman, prawdziwa księga z kamieni szlachetnych lub gdzie indziej). Jest to również ważne, chociaż nie jestem pewien, ponieważ nie zajrzałem do kodu tak głęboko, rejestruje on rodzaj "globalError", ponieważ w następnym kroku Jasmine uruchamia drugą specyfikację i wywołuje getJasmineRequireObj().GlobalErrors funkcja (jasmine.js:2204). Wykryto "globalError" i specyfikacja natychmiast staje się awarią. Asynchroniczne oczekiwanie jest dodawane do stosu po funkcji Karmy, tej, która zgłasza błąd
  3. Następnie pierwsza funkcja (która zgłasza błąd) rozpoczyna wykonywanie, dodając rzuty.Funkcja ta zawsze będzie wezwany przed Jasmine asynchronicznego specyfikacji, ponieważ w debug.js nie ma czasu przekazany do wywołania setTimeout:

    //notice the absent time argument setTimeout(function() { throw err })

  4. Jasmine uruchamia assync oczekiwać od drugiej specyfikacji i przechodzi

  5. Karma donosi na drugim specyfikacji jako awaria i dodaje rzucanie błędzie (jeśli nie wypowiedziało się, a następnie pojawia się żaden błąd, a to specyfikacja przechodzi) do stosu
  6. drugi błąd
  7. Karma jest rzucony

Poniżej zrzuty ekranu z numerami, umieszczone przeze mnie do zilustrowania kroki z listy:

z throw nie skomentował w pliku debug.js:

karma jasmine errors step by step

iz skomentował throw:

karma jasmine without throwing in the debug.js file

Powiązane problemy