如何使用茉莉编写开关盒的单元测试

时间:2015-08-17 16:07:28

标签: unit-testing switch-statement jasmine

下面是我的代码

var s=function(){
return 'API CALL';//Through some API call i am getting and integer value
};

switch(s()){
case 0: store.p1="Some Text"; break;
case 1: store.p1="Some Other Text"; break;
case 2: store.p1="Another Text"; break;
}

在上面的函数中,我正在触发API调用,它返回一个整数值(0,1,2)并将其存储在's'中,我想用jasmine编写单元测试...,有谁可以帮助如何写测试用例?!

注意:'store'是全局变量,p1是'store'中的另一个变量,我想存储's'的值。

4 个答案:

答案 0 :(得分:0)

为什么不将switch statement function作为parameter,并根据参数返回消息。这样单元测试将更容易,因为您可以对功能进行单元测试。

function getValueStoredMessage(integer) {
 return 'value ' + integer + ' stored';
}

你可以这样称呼它:

store.p1 = getValueStoredMessage(valueFromApi);

我个人没有编写过很多单元测试,但我认为函数比开关更容易?

答案 1 :(得分:0)

要正确测试您的API函数,您需要将其模拟出来并伪造返回值。有很多方法可以做到这一点,其中一些方法取决于你的API如何工作(角度http,服务,承诺等)。

看看茉莉花的间谍。如果它适用于您的情况,它们可能是最简单的。有点像:

spyOn(APIObject, "APIMethod").and.returnValue(1);  
expect(store.p1).toBe(value 1 stored);

如果您没有模拟对象进行间谍活动,则可以使用createSpy创建一个模拟对象,它将以相同的方式工作。

答案 2 :(得分:0)

使用map的大多数情况(就像你的情况一样)比使用switch更好。

function convert(str) {
    //...
}

var s = '字符串'
convert(s); // => \u5B57\u7B26\u4E32

如果你想测试它,你必须模拟syncApiCallReturnsInteger()。为了做到这一点,它必须是可注射的。商店也必须是可注射的,所以你可以检查它的变化。

function f(){
    var myInteger = syncApiCallReturnsInteger();
    var map = {
        0: "Some Text",
        1: "Some Other Text",
        2: "Another Text"
    };
    store.p1 = map[myInteger];
}

测试:

function f(syncApiCallReturnsInteger, store){
    var myInteger = syncApiCallReturnsInteger();
    var map = {
        0: "Some Text",
        1: "Some Other Text",
        2: "Another Text"
    };
    store.p1 = map[myInteger];
}

如果你没有正确地注入依赖项,那么你唯一能做的就是使用和覆盖全局变量,这通常是一个坏主意,因为当你的项目增长时会有变量名冲突。

答案 3 :(得分:0)

简单来说,您不测试交换机。

一个开关,就像if,else,where,when和其他类似的东西是语言构造一样,所以不需要测试。测试处理流控制的部分代码,为流的每个结果编写不同的测试。

这意味着每个选项都有一个单独的套件。

function rockPaperScisors(){ ... // switch statement for the return value }

describe('rock paper scissors caller', function(){
    beforeEach(function(){
        var throw;
    });

    it("should return rock when 1 is entered", function(){
        throw = 1;
        expect(throw).toEqual('rock');
    });

    it("should return paper when 2 is entered", function(){
        throw = 2;
        expect(throw).toEqual('paper');
    });

    it("should return scissor when 3 is entered", function(){
        throw = 3;
        expect(throw).toEqual('scisor');
    });
});

describe('rock paper scissors caller', function(){ beforeEach(function(){ var throw; }); it("should return rock when 1 is entered", function(){ throw = 1; expect(throw).toEqual('rock'); }); it("should return paper when 2 is entered", function(){ throw = 2; expect(throw).toEqual('paper'); }); it("should return scissor when 3 is entered", function(){ throw = 3; expect(throw).toEqual('scisor'); }); });