Try/catch 与茉莉花
Try/catch with jasmine
我有一个函数试图将参数解析为 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!');
我没有发现这段代码有任何问题。但是,当我尝试为 'catch' 案例添加一些单元测试(使用 Jasmine 2.3)时,Jasmine 自己捕获 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();
});
});
在这两种情况下,测试都失败并且 returns:
SyntaxError: Unable to parse JSON string
我读到过使用 throw Error(...)
抛出受控异常,但显然这不适合我的情况。关于在这种情况下如何使用 Jasmine 有什么建议吗?
你不能自己调用这个函数,你必须通过添加一个包装函数让Jasmine调用它。另一种解释方式是 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");
});
您尝试过包装给定的 fn 吗?这样 jasmine 将能够自己执行它并提供额外的代码来捕获它。
describe("usingJSONFallback", function() {
it("should throw an error if it's called with a string", function() {
expect(function () {
usingJSONFallback("any string");
}).toThrow();
});
});
我有一个函数试图将参数解析为 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!');
我没有发现这段代码有任何问题。但是,当我尝试为 'catch' 案例添加一些单元测试(使用 Jasmine 2.3)时,Jasmine 自己捕获 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();
});
});
在这两种情况下,测试都失败并且 returns:
SyntaxError: Unable to parse JSON string
我读到过使用 throw Error(...)
抛出受控异常,但显然这不适合我的情况。关于在这种情况下如何使用 Jasmine 有什么建议吗?
你不能自己调用这个函数,你必须通过添加一个包装函数让Jasmine调用它。另一种解释方式是 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");
});
您尝试过包装给定的 fn 吗?这样 jasmine 将能够自己执行它并提供额外的代码来捕获它。
describe("usingJSONFallback", function() {
it("should throw an error if it's called with a string", function() {
expect(function () {
usingJSONFallback("any string");
}).toThrow();
});
});