2015-11-16 14 views
5

Ich habe eine Funktion, die versucht, einen Parameter als ein JSON-Objekt zu analysieren. Wenn es fehlschlägt, wird stattdessen ein Fallback verwendet.Versuchen/fangen mit Jasmin

Parse-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!'); 

Ich sehe kein Problem in diesem Code. Wenn ich jedoch versuche, einige Unittests (mit Jasmine 2.3) für den Fall "catch" hinzuzufügen, fängt Jasmine den JSON-Parsing-Fehler selbst ab und bricht den Test ab:

Zum Beispiel für einen Jasmin-Test wie :

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

oder sogar ein Test wie:

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

In beiden Fällen schlägt der Test fehl und kehrt:

SyntaxError: Unable to parse JSON string 

Ich lese über das Werfen kontrollierte Ausnahmen mit throw Error(...), aber definitiv passt das nicht gut für meinen Fall. Irgendwelche Vorschläge, wie man Jasmine in diesem Fall benutzt?

Antwort

7

Sie können die Funktion nicht selbst aufrufen, Sie müssen sich von Jasmine anrufen lassen, indem Sie eine Wrapper-Funktion hinzufügen. Eine andere Möglichkeit, es zu erklären, ist, dass expect eine Funktion benötigt, die an es übergeben wird, wenn Sie es zum Werfen testen.

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

Von ihren example page, feststellen, dass die Funktion in aber nicht genannt geben wird.

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

Haben Sie versucht, die angegebene Fn zu wickeln? Auf diese Weise kann Jasmin es selbst ausführen und zusätzlichen Code bereitstellen, um es zu fangen.

describe("usingJSONFallback", function() { 

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

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

    }); 

});