Jasmine - 如何测试错误?

时间:2015-01-10 11:49:58

标签: javascript angularjs unit-testing jasmine

情况:

大家好。我正在学习茉莉花来测试我的角度应用程序。

我创建了一个将两个数相乘的基本函数。 如果给定的参数不是数字,则函数会抛出错误。

然后我做了两个非常基本的测试。

首先检查函数是否正确乘以数字。 第二个是检查函数是否正确抛出错误,如果给出一个字符串作为参数。

第一次测试通过,第二次没有。我不明白为什么。

代码:

功能:

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.

3 个答案:

答案 0 :(得分:5)

如果我理解正确,您需要将函数传递给expect(...)调用。

你在这里的代码:

expect(result).toThrow(new Error("not a number"));

检查Multiply的结果,当它工作正常时,但就像我说.toThrow()需要一个函数,我会使用匿名函数,见下文:

expect( function(){ Multiply(10, 'aaaa'); } ).toThrow(new Error("not a number"));

编辑:快速搜索和this博客文章是对我想说的内容的非常详细的解释。

答案 1 :(得分:4)

您需要将您期望的代码放入函数中:

expect(function () {
    Multiply(10, 'aaaa');
}).toThrow(Error, 'not a number');

否则,当您运行断言时,错误已经被抛出范围之外。您可以在jasmine docs

中查看错误匹配的可用语法

答案 2 :(得分:0)

  • 上述方法对于方法内部处理的异常完全正确。
  • 在测试服务时,可以使用 mocking mechanism 来完成。
  • 利用 NgModule提供程序部分的优势来创建模拟。

  • 在describe()块中,

providers: [{ provide: APIService, useValue: { api: { filterTaskDetails: () => throwError('Error') }}}]

throwError要从rxjs导入。

  • 在Expect()块中对其进行测试,
spyOn(component['toaster'], 'showError');
/** add respected it() blocks**/
expect(component['toaster'].showError).toHaveBeenCalledTimes(1);