尝试/捕捉茉莉花

时间:2015-11-16 14:32:12

标签: javascript json unit-testing jasmine karma-jasmine

我有一个函数试图将参数解析为JSON对象。如果失败,则使用后备。

解析-code.js

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".DisplayCountryActivity">


    <ListView android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1"
        android:id="@+id/list_view">
    </ListView>

main.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
}

我在这段代码中没有看到任何问题。但是,当我尝试添加一些单元测试(使用Jasmine 2.3)来捕捉&#39;例如,Jasmine自己捕获JSON解析错误并中止测试:

例如,对于Jasmine测试,例如:

//Some code...
parseCode('hello world!');

甚至像以下那样的测试:

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 抛出受控异常,但最终这并不适合我的情况。关于如何在这种情况下使用Jasmine的任何建议?

2 个答案:

答案 0 :(得分:10)

你不能自己调用​​这个函数,你必须让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");
  });

答案 1 :(得分:5)

你试过包装给定的fn吗?这样jasmine就可以自己执行它并提供额外的代码来捕获它。

describe("usingJSONFallback", function() {

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

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

    });

});