2015-11-16 3 views
5

У меня есть функция, которая пытается проанализировать параметр как объект JSON. Если он не удался, вместо этого он использует резервную копию.Try/catch with jasmine

разбора 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 2.3) для случая «catch», Жасмин улавливает ошибку анализа JSON самостоятельно и отменяет тест:

Например, для теста Jasmine, такого как :

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(); 

    }); 

}); 
Смежные вопросы