2015-11-16 6 views
5

私は、パラメータをJSONオブジェクトとして解析しようとする機能を持っています。失敗した場合は代わりにフォールバックを使用します。ジャスミンで試してみる

構文解析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!'); 

私はこのコードですべての問題を見ていませんよ。しかし、Jasmineは 'catch'の場合にJasmine 2.3を使用して単体テストを追加しようとすると、JSON解析エラーを単独でキャッチしてテストを中止します。

たとえば、ジャスミンテストのように:

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

あるいは状試験:両方の場合において

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

、テストが失敗し、返し:

SyntaxError: Unable to parse JSON string 

私はthrow Error(...)を使って制御された例外を投げることについて読んだが、確かにこれは私の場合にはうまく収まらなかった。この場合のジャスミンの使用方法に関する提案はありますか?

答えて

7

自分で関数を呼び出すことはできません。ジャスミンにラッパー関数を追加して呼び出さなければなりません。それを説明する別の方法は、expectがそれをスローするためにテストするときに関数に渡す必要があるということです。

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

example pageから、この関数は渡されても呼び出されないことに注意してください。

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

指定したfnをラップしてみましたか?この方法でジャスミンはそれを自分自身で実行し、それを捕まえるための余分なコードを提供することができます。

describe("usingJSONFallback", function() { 

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

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

    }); 

});