使用相同类型的100多个测试的Jasmine单元测试

fre*_*yer 4 javascript unit-testing jasmine

我最近发现了用于单元测试的Jasmine,它似乎是我正在做的一个很好的解决方案.但是,我正在测试大约100种不同的可能性,我不想一遍又一遍地编写相同的代码行.

所以我制作了一个充满测试的对象,并且我正在使用这些测试一遍又一遍地进行单元测试.它在运行时打印出正确数量的测试.它们都通过如下所示.

但后来我将"cero"更改为"cerFOOBARBAZ",它仍然通过,这是错误的.然后我将0更改为任意数字(例如993)并且它不会通过(它不应该,但是所有测试都会失败.

那是怎么回事?

   var tests = {
        0 : "cero",
        1 : "uno",
        2 : "dos", 
        3 : "tres", 
        4 : "cuatro",
        5 : "cinco",
        6 : "seis", 
        7 : "siete",
        8 : "ocho",
        9 : "nueve",
        10 : "diez",
        11 : "once",
        12 : "doce",
        13 : "trece"

        };

describe("Numbers Return Correctly", function() {

    for(var test in tests) {
        it("Returns Correct String Based On Integer Input", function() {
            var number = parseInt(test);
            expect(number.convertNumToWord("es")).toEqual(tests[test]);
        });
    }
});
Run Code Online (Sandbox Code Playgroud)

编辑:我发现了什么问题.我多次运行整个描述,而不是单一规格.

但是,当我这样做时:

    var tests = {
        0 : "cero",
        1 : "uno",
        2 : "dos", 
        3 : "tres", 
        4 : "cuatro",
        5 : "cinco",
        6 : "seis", 
        7 : "siete",
        8 : "ocho",
        9 : "nueve",
        10 : "diez",
        11 : "once",
        12 : "doce",
        13 : "trece"

        };

describe("Numbers Return Correctly", function() {


        //console.log(test);
        //console.log(tests[test]);
        it("Returns Correct String Based On Integer Input", function() {
            for(var test in tests) {
                var number = parseInt(test);
                expect(number.convertNumToWord("es")).toEqual(tests[test]);
            }
        });

});
Run Code Online (Sandbox Code Playgroud)

我得到了预期的输出,除了没有关于哪个规范没有通过的细粒度细节.有帮助吗?

HoL*_*ieR 7

您需要为每个测试创建一个闭包,否则在第一个示例中,您只需要测试很多时间的最后一个值.它的干净版本看起来像这样:

describe("Numbers Return Correctly", function() {
    var tests = {  }; // ...

    function addTest(test) {
        it("Returns Correct String Based On Integer Input " + test, function() {
            var number = parseInt(test, 10);
            expect(number.convertNumToWord("es")).toEqual(tests[test]);
        });
    }

    for(var test in tests) {
        addTest(test);
    }
});
Run Code Online (Sandbox Code Playgroud)