angular - Kan inte verka fånga fel när man använder Jasmine toThrowError


Jag börjar prova Jasmine och jag vill använda funktionen toThrowError(), men mitt test vill inte lyckas.

Jag har en funktion där jag kastar ett fel:

test.service.ts

test(list:{}){ 
    if(list == null){
        throw new TypeError();
    }
    else{
        // do something...
    }
}

Och mitt test :

it('shall throw an error', inject()
    [
        TestService
    ],
    (
        testService: TestService
    ) => {
        let test = testService.test(null);
        expect(test).toThrowError(TypeError);
    }
);

Och mitt test misslyckas med ett Ouppfångat TypeError (när jag anropar det gör jag det i en try catch).

Svar #1

Du bör förvänta dig att en funktion, som anropar din funktion med null, kastar ett fel. Just nu förväntar du dig att resultatet av att anropa funktionen ska kasta ett fel, vilket inte händer.

expect(() => testService.test(null)).toThrowError(TypeError);

Med andra ord, följande rad i testet:

let test = testService.test(null);

utför test-funktionen med null, vilket kastar TypeError. Eftersom det inte är inom expect anses det av jasmine vara "okänt fångat". Efter att felet har kastats utförs inget annat. Raden expect(test).toThrowError(TypeError); anropas aldrig.

Koden jag har visat ovan skickar en funktion till expect. När Jasmine kör den funktionen kommer den att kasta TypeError, och uppfylla villkoret toThrowError(TypeError).

Svar #2

  • Du kanske måste kasta felet från spionen på det här sättet här.

  • Du förväntade dig redan innan felet uppstod

    spyOn(foo, "setBar").and.throwError("quux");