如何使用 jasmine 编写 switch case 单元测试

问题描述 投票:0回答:4

下面是我的代码

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'的值。

unit-testing switch-statement jasmine
4个回答
0
投票

为什么不将这个

switch statement
制作为
function
,它接受
parameter
并根据参数返回消息。这样单元测试会更容易,因为您可以对函数进行单元测试。

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

你可以这样称呼它:

store.p1 = getValueStoredMessage(valueFromApi);

我个人没有写过很多单元测试,但我想函数会比 switch 更容易?


0
投票

为了正确测试你的 API 函数,你需要模拟它并让它伪造返回值。有很多方法可以做到这一点,其中一些方法取决于您的 API 的工作方式(角度 http、服务、promise 等)。

看看茉莉花间谍。如果适合您的情况,它们可能是最简单的。类似于:

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

如果您没有要监视的模拟对象,您可以使用

createSpy
创建一个模拟对象,它会以相同的方式工作。


0
投票

大多数情况下(就像你的情况一样)使用地图是比使用 switch 更好的选择。

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

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

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

测试:

describe("blah", function() {
    it("f sets store.p1", function() {
        var fixture2expectation = {
            0: "Some Text",
            1: "Some Other Text",
            2: "Another Text"
        };

        for (var fixtureString in fixture2expectation){
            var fixture = parseInt(fixtureString);
            var expectation = fixture2expectation[fixture];
            var mockApiCall = function (){return fixture;};
            var mockStore = {};
            f(mockApiCall, mockStore);
            expect(mockStore.p1).toBe(expectation);
        }
    });
});

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


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');
    });
});

© www.soinside.com 2019 - 2024. All rights reserved.