【问题标题】:How to write unit test for switch case using jasmine如何使用 jasmine 为 switch case 编写单元测试
【发布时间】:2015-11-10 08:37:02
【问题描述】:

下面是我的代码

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


    【解决方案1】:

    你为什么不把这个switch statement 变成一个function,它接受一个parameter 并根据参数返回一条消息。这样单元测试会更容易,因为您可以对函数进行单元测试。

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

    你可以这样称呼它:

    store.p1 = getValueStoredMessage(valueFromApi);
    

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

    【讨论】:

    • 但我有不同的文本要根据大小写返回...,例如,如果返回值为 0 则设置 store.p1="abcd",反之亦然返回值 1 和 2 。对不起,这是我的坏我会用代码写入存储.p1 =“某些文本”时选择了案例0时,选择案例1的store.p1 =“一些其他文本”并存储.p1 =“另一个文本“选择案例2时。 span>
    【解决方案2】:

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

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

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

    如果您没有要 spyOn 的模拟对象,您可以使用 createSpy 创建一个模拟对象,它的工作方式相同。

    【讨论】:

    • ktharsis 感谢您的回复...,我已经尝试过您的 spyOn 并期待,但它显示错误:预期未定义为“存储的值 1”。我已经认识到 jasmine 无法找到 store.p1 变量......我的规范文件似乎没有引用我的 store.p1 定义的javascript文件,我对吗?我已经编辑了存储到“一些文本”的问题值 1,反之亦然..
    • 您需要提供更多代码以便我们提供帮助,尤其是您遇到问题的测试部分。如果您添加代码/尝试新事物,请务必更新问题,而不仅仅是在每个答案中添加 cmets。
    【解决方案3】:

    大多数情况下(就像你的情况一样)使用 map 是比使用 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);
            }
        });
    });
    

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

    【讨论】:

      【解决方案4】:

      简单来说,您不需要测试开关。

      开关,就像 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');
          });
      });
      

      【讨论】:

        猜你喜欢
        • 2021-03-03
        • 2022-11-03
        • 1970-01-01
        • 2023-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-01
        相关资源
        最近更新 更多