Jasmine - 如何测试错误?
Jasmine - How to test errors?
情况:
大家好。我正在学习 jasmine 来测试我的 angular 应用程序。
我创建了一个基本函数,可以将两个数字相乘。
如果给定的参数不是数字,函数会抛出错误。
然后我做了两个非常基本的测试。
首先检查函数是否正确地乘以数字。
第二个检查如果字符串作为参数给出,函数是否正确抛出错误。
第一次测试通过,第二次没有通过。我不明白为什么。
代码:
函数:
function Multiply( num1, num2 )
{
var result;
if (isNaN(num1) || isNaN(num2))
{
throw new Error("not a number");
}
else
{
result = num1 * num2;
return result;
}
}
规格:
describe('The function', function ()
{
it('properly multiply two numbers', function ()
{
result = Multiply(10, 5);
expect(result).toEqual(50);
});
it('throw an error if a parameter is not a number', function ()
{
result = Multiply(10, 'aaaa');
expect(result).toThrow(new Error("not a number"));
});
});
输出:
2 specs, 1 failure
Spec List | Failures
The function throw an error if a parameter is not a number
Error: not a number
Error: not a number
at Multiply (http://localhost/jasmine_test/src/app.js:8:9)
如果我没看错的话茉莉花。两个测试都应该通过,因为在第二种情况下,函数会按照我们的预期抛出错误。
问题:
如何测试函数是否正确抛出错误?
编辑:
我正在尝试这个新代码,但仍然无法正常工作:
describe('The function', function ()
{
it('throw an error if a parameter is not a number', function ()
{
expect(function() { Multiply(10, 'aaaa') }).toThrowError(new Error("not a number"));
});
});
输出:
2 specs, 1 failure
Spec List | Failures
The function throw an error if a parameter is not a number
Error: Expected is not an Error, string, or RegExp.
如果我理解正确,您需要将一个函数传递给 expect(...)
调用。
您在此处的代码:
expect(result).toThrow(new Error("not a number"));
正在检查 Multiply 的结果,当它工作时它很好,但就像我说的 .toThrow() 需要一个函数,我会改用匿名函数,见下文:
expect( function(){ Multiply(10, 'aaaa'); } ).toThrow(new Error("not a number"));
编辑:进行了快速搜索,this 博客 post 对我想说的内容进行了非常详细的解释。
您需要将您希望抛出错误的代码放入函数中:
expect(function () {
Multiply(10, 'aaaa');
}).toThrow(Error, 'not a number');
否则,当你运行你的断言时,错误已经抛出范围之外了。您可以在 jasmine docs
中查看错误匹配的可用语法
- 对于在方法内部处理的异常,上述方法完全正确。
- 当您需要测试服务时,您可以使用
mocking mechanism
来完成。
利用 NgModule 提供者 部分的优势来创建模拟。
在 describe() 块中,
providers: [{ provide: APIService, useValue: { api: { filterTaskDetails: () => throwError('Error') }}}]
throwError
to be imported from rxjs
.
- 在 expect() 块中测试它,
spyOn(component['toaster'], 'showError');
/** add respected it() blocks**/
expect(component['toaster'].showError).toHaveBeenCalledTimes(1);
情况:
大家好。我正在学习 jasmine 来测试我的 angular 应用程序。
我创建了一个基本函数,可以将两个数字相乘。 如果给定的参数不是数字,函数会抛出错误。
然后我做了两个非常基本的测试。
首先检查函数是否正确地乘以数字。 第二个检查如果字符串作为参数给出,函数是否正确抛出错误。
第一次测试通过,第二次没有通过。我不明白为什么。
代码:
函数:
function Multiply( num1, num2 )
{
var result;
if (isNaN(num1) || isNaN(num2))
{
throw new Error("not a number");
}
else
{
result = num1 * num2;
return result;
}
}
规格:
describe('The function', function ()
{
it('properly multiply two numbers', function ()
{
result = Multiply(10, 5);
expect(result).toEqual(50);
});
it('throw an error if a parameter is not a number', function ()
{
result = Multiply(10, 'aaaa');
expect(result).toThrow(new Error("not a number"));
});
});
输出:
2 specs, 1 failure
Spec List | Failures
The function throw an error if a parameter is not a number
Error: not a number
Error: not a number
at Multiply (http://localhost/jasmine_test/src/app.js:8:9)
如果我没看错的话茉莉花。两个测试都应该通过,因为在第二种情况下,函数会按照我们的预期抛出错误。
问题:
如何测试函数是否正确抛出错误?
编辑:
我正在尝试这个新代码,但仍然无法正常工作:
describe('The function', function ()
{
it('throw an error if a parameter is not a number', function ()
{
expect(function() { Multiply(10, 'aaaa') }).toThrowError(new Error("not a number"));
});
});
输出:
2 specs, 1 failure
Spec List | Failures
The function throw an error if a parameter is not a number
Error: Expected is not an Error, string, or RegExp.
如果我理解正确,您需要将一个函数传递给 expect(...)
调用。
您在此处的代码:
expect(result).toThrow(new Error("not a number"));
正在检查 Multiply 的结果,当它工作时它很好,但就像我说的 .toThrow() 需要一个函数,我会改用匿名函数,见下文:
expect( function(){ Multiply(10, 'aaaa'); } ).toThrow(new Error("not a number"));
编辑:进行了快速搜索,this 博客 post 对我想说的内容进行了非常详细的解释。
您需要将您希望抛出错误的代码放入函数中:
expect(function () {
Multiply(10, 'aaaa');
}).toThrow(Error, 'not a number');
否则,当你运行你的断言时,错误已经抛出范围之外了。您可以在 jasmine docs
中查看错误匹配的可用语法- 对于在方法内部处理的异常,上述方法完全正确。
- 当您需要测试服务时,您可以使用
mocking mechanism
来完成。 利用 NgModule 提供者 部分的优势来创建模拟。
在 describe() 块中,
providers: [{ provide: APIService, useValue: { api: { filterTaskDetails: () => throwError('Error') }}}]
throwError
to be imported fromrxjs
.
- 在 expect() 块中测试它,
spyOn(component['toaster'], 'showError');
/** add respected it() blocks**/
expect(component['toaster'].showError).toHaveBeenCalledTimes(1);