2015-11-16 14 views
5

Mam funkcję, która próbuje parsować parametr jako obiekt JSON. Jeśli się nie uda, zamiast tego używa zastępczego.Spróbuj/złap z jaśminem

analizy:-code.js

function parseCode(code) { 
    try { 
     usingJSONFallback(code); 
    } catch() { 
     usingStringFallback(code); 
    } 
} 

function usingJSONFallback(code) { 
    JSON.parse(code); 
    //...more code here 
} 

function usingStringFallback(code) { 
    //... more code here 
} 

main.js

//Some code... 
parseCode('hello world!'); 

Nie widzę żadnego problemu w tym kodzie. Jednak gdy próbuję dodać kilka testów jednostkowych (przy użyciu Jasmine 2.3) w przypadku "catch", Jasmine przechwytuje błąd analizy składowej JSON i przerywa test:

Na przykład dla testu jaśminowego, takiego jak :

describe('parseCode', function() { 
    it('Parses a string', function() { 
     var code = 'My code without JSON'; 
     expect(parseCode(code)).toThrow(); 
    }); 
}); 

lub nawet test jak:

describe('usingJSONFallback', function() { 
    it('Throw an error if there is a string', function() { 
     var code = 'My code without JSON'; 
     expect(usingJSONFallback(code)).toThrow(); 
    }); 
}); 

W obu przypadkach test nie powiedzie się i powraca:

SyntaxError: Unable to parse JSON string 

Czytałem o rzucaniu kontrolowanych wyjątków za pomocą throw Error(...), ale ostatecznie nie pasuje to do mojego przypadku. Wszelkie sugestie dotyczące używania Jasmine w tym przypadku?

Odpowiedz

7

Nie możesz wywołać funkcji samodzielnie, musisz pozwolić Jasmine wywołać ją, dodając funkcję owijki. Innym sposobem wyjaśnienia jest to, że expect potrzebuje funkcji przekazanej do niej podczas testowania, aby rzucić.

describe('parseCode', function() { 
    it('Parses a string', function() { 
     var code = 'My code without JSON'; 
     expect(function() { parseCode(code) }).toThrow(); 
    }); 
}); 

Z ich example page, należy zauważyć, że funkcja jest przekazywana, ale nie wywoływana.

it("The 'toThrowError' matcher is for testing a specific thrown exception", function() { 
    var foo = function() { 
     throw new TypeError("foo bar baz"); 
    }; 

    expect(foo).toThrowError("foo bar baz"); 
    expect(foo).toThrowError(/bar/); 
    expect(foo).toThrowError(TypeError); 
    expect(foo).toThrowError(TypeError, "foo bar baz"); 
    }); 
3

Czy próbowałeś owijać dany fn? W ten sposób jaśmin będzie mógł wykonać go samodzielnie i dostarczyć dodatkowy kod, aby go złapać.

describe("usingJSONFallback", function() { 

    it("should throw an error if it's called with a string", function() { 

     expect(function() { 
      usingJSONFallback("any string"); 
     }).toThrow(); 

    }); 

});