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

     2023-02-22     240

关键词:

【中文标题】如何使用 jasmine 为 switch case 编写单元测试【英文标题】:How to write unit test for switch case using jasmine 【发布时间】: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' 的值。

【问题讨论】:

【参考方案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');
    );
);

【讨论】:

如何使用 Jasmine 为私有方法编写 Angular / TypeScript 单元测试

】如何使用Jasmine为私有方法编写Angular/TypeScript单元测试【英文标题】:HowtowriteunittestingforAngular/TypeScriptforprivatemethodswithJasmine【发布时间】:2016-06-2911:06:28【问题描述】:如何在Angular2中测试私有函数?classFooBarprivate_status:number;co... 查看详情

预期 [ ] 为 [ ] Jasmine,如何检查空数组

】预期[]为[]Jasmine,如何检查空数组【英文标题】:Expected[]tobe[]Jasmine,howtocheckemptyarray【发布时间】:2018-03-1414:09:34【问题描述】:尝试检查空数组时出错。我尝试使用:案例1:通过初始化为数组expect(fixture.componentInstance.dataSource... 查看详情

如何在 Angular 7 中使用 Karma/Jasmine 为 App_Initializer 编写单元测试用例

】如何在Angular7中使用Karma/Jasmine为App_Initializer编写单元测试用例【英文标题】:howtowriteunittestcasesforApp_InitializerusingKarma/Jasmineinangular7【发布时间】:2019-06-3002:41:22【问题描述】:我已经在我的app.module.ts文件中导入了APP_INITIALIZER... 查看详情

如何使用 angular9 和 Jasmine 为所有组件生成 .pdf 格式的单元测试用例代码覆盖率报告

】如何使用angular9和Jasmine为所有组件生成.pdf格式的单元测试用例代码覆盖率报告【英文标题】:Howtogenerateunittestcasecodecoveragereportin.pdfforallcomponentsusingangular9andJasmine【发布时间】:2021-06-2104:04:18【问题描述】:.html格式的Angular支... 查看详情

如何在 Jasmine 测试中测试 $scope?

】如何在Jasmine测试中测试$scope?【英文标题】:Howtotest$scopeinJasminetest?【发布时间】:2016-09-1414:47:20【问题描述】:我尝试使用Jasmine为Angularjs编写单元测试。这是我的控制器:functionHomeController($scope,fav,news,materials)console.log(\'homec... 查看详情

如何测试使用 jasmine + TypeScript 使用常量调用的函数

】如何测试使用jasmine+TypeScript使用常量调用的函数【英文标题】:Howdoyoutestafunctionwhichiscalledwithaconstantusingjasmine+TypeScript【发布时间】:2016-11-2915:39:35【问题描述】:我正在开发一个Angular2/TypeScript项目并使用jasmine进行单元测试。... 查看详情

如何使用 karma/jasmine 在 angularAMD 中模拟服务?

】如何使用karma/jasmine在angularAMD中模拟服务?【英文标题】:HowtomockserviceinangularAMDwithkarma/jasmine?【发布时间】:2014-12-1223:44:13【问题描述】:我有一个使用AngularAMD/RequireJS/Karma/Jasmine的项目,我的基本配置一切正常,大多数单元... 查看详情

如何确认我使用的是啥版本的 Jasmine?

】如何确认我使用的是啥版本的Jasmine?【英文标题】:HowcanIconfirmwhatversionofJasmineI\'musing?如何确认我使用的是什么版本的Jasmine?【发布时间】:2014-08-3017:37:24【问题描述】:如果我记得Jasmine中有一个命令可以将我正在运行的Jasm... 查看详情

如何确认我使用的是啥版本的 Jasmine?

】如何确认我使用的是啥版本的Jasmine?【英文标题】:HowcanIconfirmwhatversionofJasmineI\'musing?如何确认我使用的是什么版本的Jasmine?【发布时间】:2014-08-3017:37:24【问题描述】:如果我记得Jasmine中有一个命令可以将我正在运行的Jasm... 查看详情

如何安装和使用karma-jasmine

 注意:本文中出现的资料链接、karma的插件安装等,均可能需要翻$墙后才能正确执行。 Jasmine是一个JavaScript的测试工具,在Karma上运行Jasmine可完成Javascript的自动化测试、生成覆盖率报告等。本文不包含Jasmine的使用细节... 查看详情

如何编写一个期望在 Jasmine 中抛出“错误”的测试?

】如何编写一个期望在Jasmine中抛出“错误”的测试?【英文标题】:HowcanIwriteatestwhichexpectsan\'Error\'tobethrowninJasmine?【发布时间】:2011-05-0721:05:06【问题描述】:我正在尝试为JasmineTestFramework编写一个测试,它预计会出错。目前我... 查看详情

如何使用 Jasmine 监视值属性(而不是方法)

】如何使用Jasmine监视值属性(而不是方法)【英文标题】:HowtospyOnavalueproperty(ratherthanamethod)withJasmine【发布时间】:2014-01-1917:25:57【问题描述】:Jasmine的spyOn可以很好地改变方法的行为,但是有没有办法改变对象的值属性(而... 查看详情

你如何使用 Jasmine + Resharper 引用外部库

】你如何使用Jasmine+Resharper引用外部库【英文标题】:HowdoyoureferenceexternallibrarieswithJasmine+Resharper【发布时间】:2013-07-2603:19:48【问题描述】:我可以从Resharper8.0单元测试运行器运行Jasmine单元测试。我有一个问题,通常在html页面... 查看详情

AngularJS – 如何在 Jasmine 中为输入事件指令编写单元测试

】AngularJS–如何在Jasmine中为输入事件指令编写单元测试【英文标题】:AngularJS–howtowriteunit-testinJasmineforentereventsdirective【发布时间】:2014-09-1516:45:23【问题描述】:我在AngularJS中创建了enterevent指令,所以我想为该指令运行测试... 查看详情

如何使用 Angular 和 Jasmine 模拟 socket.io

】如何使用Angular和Jasmine模拟socket.io【英文标题】:Howtomocksocket.iowithAngularandJasmine【发布时间】:2015-05-0422:40:53【问题描述】:我无法弄清楚如何使用Jasmine和Karma在Angular应用程序中正确模拟Socket.io。这是在karma.conf.js中找到的文... 查看详情

如何在 Jasmine-Rails 中使用 CoffeeScript 规范

】如何在Jasmine-Rails中使用CoffeeScript规范【英文标题】:HowtouseCoffeeScriptspecswithJasmine-Rails【发布时间】:2013-06-1422:34:48【问题描述】:我正在运行带有Ruby版本2.0.0-p195的Rails3.2.13。我正在使用启用资产管道的Jasmine-Railsgem版本0.4.5。... 查看详情

为使用 Observables 的 Angular 2 组件编写 Jasmine 测试

】为使用Observables的Angular2组件编写Jasmine测试【英文标题】:WritingJasminetestforAngular2componentwhichusesObservables【发布时间】:2017-11-0615:44:18【问题描述】:我正在尝试测试一个使用服务调用和可观察调用来获取数据列表的angular2组件... 查看详情

如何对 DOM 操作进行单元测试(使用 jasmine)

】如何对DOM操作进行单元测试(使用jasmine)【英文标题】:howtounittestDOMmanipulation(withjasmine)【发布时间】:2013-04-1608:14:13【问题描述】:我需要用jasmine对一些DOM操作函数进行单元测试(目前我在浏览器和Karma中运行我的测试)我... 查看详情