2015-11-16 18 views
5

Tôi có một hàm cố gắng phân tích một tham số dưới dạng đối tượng JSON. Nếu nó thất bại, nó sử dụng một dự phòng thay thế.Thử/bắt với hoa nhài

phân tích cú pháp-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!'); 

Tôi không nhìn thấy bất kỳ vấn đề trong mã này. Tuy nhiên, khi tôi đang cố gắng thêm một số bài kiểm tra đơn vị (sử dụng Jasmine 2.3) cho trường hợp 'bắt', Jasmine tự mình lấy lỗi phân tích cú pháp JSON và hủy thử nghiệm:

Ví dụ, đối với thử nghiệm Jasmine như :

describe('parseCode', function() { 
    it('Parses a string', function() { 
     var code = 'My code without JSON'; 
     expect(parseCode(code)).toThrow(); 
    }); 
}); 

hoặc thậm chí là một thử nghiệm như:

describe('usingJSONFallback', function() { 
    it('Throw an error if there is a string', function() { 
     var code = 'My code without JSON'; 
     expect(usingJSONFallback(code)).toThrow(); 
    }); 
}); 

Trong cả hai trường hợp, thử nghiệm thất bại và trả về:

SyntaxError: Unable to parse JSON string 

Tôi đọc về ném ngoại lệ được kiểm soát bằng cách sử dụng throw Error(...), nhưng dứt khoát điều này không phù hợp tốt cho trường hợp của tôi. Bất kỳ đề xuất về cách sử dụng Jasmine trong trường hợp này?

Trả lời

7

Bạn không thể tự gọi hàm, bạn phải để Jasmine gọi nó bằng cách thêm chức năng trình bao bọc. Một cách khác để giải thích nó là expect cần một hàm được truyền cho nó khi bạn đang thử nghiệm nó để ném.

describe('parseCode', function() { 
    it('Parses a string', function() { 
     var code = 'My code without JSON'; 
     expect(function() { parseCode(code) }).toThrow(); 
    }); 
}); 

Từ example page của chúng tôi, hãy lưu ý rằng hàm được truyền nhưng không được gọi.

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

Bạn đã thử gói fn đã cho chưa? Bằng cách này hoa nhài sẽ có thể thực hiện nó trên riêng của nó và cung cấp thêm mã để bắt nó.

describe("usingJSONFallback", function() { 

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

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

    }); 

}); 
Các vấn đề liên quan