使用 Jasmine 进行 Angular 单元测试:如何删除或修改 spyOn

     2023-02-26     79

关键词:

【中文标题】使用 Jasmine 进行 Angular 单元测试:如何删除或修改 spyOn【英文标题】:Angular unit testing with Jasmine: how to remove or modify spyOn 【发布时间】:2015-05-03 11:55:14 【问题描述】:

AngularJS v1.2.26

茉莉花v2.2.0

如何更改或删除spyOn 的行为?当我尝试覆盖它时,我收到以下错误:Error: getUpdate has already been spied upon

var data1 = 'foo';
var data2 = 'bar';

describe("a spec with a spy", function()

    beforeEach(module('app'));

    var $q;

    beforeEach(inject(function(_updateService_, _$q_)
        updateService = _updateService_;

        //spy the results of the getUpdate()
        $q = _$q_;
        var deferred = $q.defer();
        deferred.resolve( data1 );
        spyOn(updateService, 'getUpdate').and.returnValue(deferred.promise);

    ));

    describe('and here the spy should be different', function() 

        it('returns a different value', function() 

          var deferred = $q.defer();
          deferred.resolve( data2 );
          spyOn(updateService, 'getUpdate'); //ERROR HERE
          updateService.getUpdate.and.returnValue(deferred.promise);

          ...

        );
    );

...

当我删除第二个 spyOn 时,测试不起作用。

我该怎么做?

【问题讨论】:

Jasmine SpyOn same method more than once的可能重复 【参考方案1】:

你可以覆盖它

updateService.getUpdate = jasmine.createSpy().and.returnValue(etc)

【讨论】:

有没有办法完全删除间谍?回到原来的功能? 最大的问题是,如果您在每个测试中都没有相同的功能,那为什么还要设置全局间谍呢?如果要为每个测试设置 spy,则为每个测试设置 spy。 @Jan 如果我有 50 个测试,并且其中只有一个具有与其他功能不同的功能的间谍,我宁愿只在那里更改一次,而不是每次测试. 好吧,就我而言,它位于全局对象(由本机代码定义)上。所以我有多个规范需要在不同的情况下返回不同的值...... 会不会通过调用 jasmine.createSpy().and.callThrought() 回到原来的实现?【参考方案2】:

你可以覆盖间谍的返回值

    var deferred = $q.defer();
    deferred.resolve( data1 );

    var getUpdateSpy = spyOn(updateService, 'getUpdate').and.returnValue(deferred.promise);



    var newDeferred = $q.defer();
    newDeferred.resolve( data2 );

    getUpdateSpy.and.returnValue(newDeferred.promise);        

【讨论】:

工作于 18/6/2019 如果您的所有代码都在同一个描述中,这可能会起作用,但否则不会因为未定义 getUpdateSpy... @GarfieldKlon 您可以通过在父 describe 块中定义变量 getUpdateSpy 来解决此问题。【参考方案3】:

从 jasmine v2.5 开始,使用全局 allowRespy() 设置。

jasmine.getEnv().allowRespy(true);

当您不想和/或无法接触到第一个间谍时,您可以多次致电spyOn()。注意它会返回之前的间谍(如果有的话)。

spyOn(updateService, 'getUpdate').and.returnValue(deferred.promise);
...
spyOn(updateService, 'getUpdate').and.returnValue(deferred.promise);

【讨论】:

老实说,这是我多年来一直在寻找的答案。我希望它在互联网上更流行。一百万谢谢:)【参考方案4】:

更简单的方法:

updateService.getUpdate.and.returnValue(Observable.of(status:true));

它会返回值。

【讨论】:

谢谢。其他人都错过了明显的答案。 您的类型系统似乎没有抱怨。这就引出了一个问题:为什么要使用 Typescript?【参考方案5】:

另一种选择:

(yourService.method as jasmine.Spy).and.returnValue(value);

【讨论】:

【参考方案6】:

绿色复选标记的答案对我不起作用,但确实如此:

yourCoolService.createThing = jasmine.createSpy('notreal', function()).and.returnValue();

您的 jasmine 测试将运行,但是当您启动应用程序时,如果您不将随机字符串和空函数作为 args 放入 createSpy(),您的应用程序打字稿会大声对您大喊大叫。

【讨论】:

这可能是由于更新了 Jasmine 版本。我正在使用 2.7,这对我有用。

在 Angular 中使用 Jasmine 使用 *ngIf 指令时,如何对元素是不是可见进行单元测试

】在Angular中使用Jasmine使用*ngIf指令时,如何对元素是不是可见进行单元测试【英文标题】:HowdoIunittestifanelementisvisiblewhenthe*ngIfdirectiveisusedusingJasmineinAngular在Angular中使用Jasmine使用*ngIf指令时,如何对元素是否可见进行单元测试【... 查看详情

使用 jasmine / karma 进行 Angular 4 单元测试和 http post mocking - 如何修复

】使用jasmine/karma进行Angular4单元测试和httppostmocking-如何修复【英文标题】:Angular4unittestingwithjasmine/karmawithhttppostmocking-howtofix【发布时间】:2018-03-0708:01:12【问题描述】:我有一项服务,我想在Angular4typescriptjasmine中进行单元测试... 查看详情

使用 Karma Jasmine 的 Angular 1.5 组件模板单元测试

】使用KarmaJasmine的Angular1.5组件模板单元测试【英文标题】:Angular1.5ComponenttemplateunittestwithKarmaJasmine【发布时间】:2017-09-1522:06:34【问题描述】:我正在尝试使用KarmaJasmine对Angular组件和模板进行单元测试。我正在使用ng-html2js测试... 查看详情

使用 jasmine、chutzpah 和 webpack 进行 Typescript 单元测试

】使用jasmine、chutzpah和webpack进行Typescript单元测试【英文标题】:Typescriptunittestingwithjasmine,chutzpahandwebpack【发布时间】:2017-06-2102:10:58【问题描述】:我正在尝试使用Angular2、Webpack和Chutzpah对typescript进行单元测试,但在为Webpack捆... 查看详情

使用 jasmine 和 karma 进行单元测试时形成数组错误

】使用jasmine和karma进行单元测试时形成数组错误【英文标题】:Formsarrayerrorwhileunittestusingjasmineandkarma【发布时间】:2021-01-1909:04:36【问题描述】:我正在为Angular应用程序版本9编写单元测试用例。但我遇到了错误。TypeError:无法读... 查看详情

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

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

如何使用 Angular 4 Jasmine 单元测试用例覆盖 IF/ELSE 条件

】如何使用Angular4Jasmine单元测试用例覆盖IF/ELSE条件【英文标题】:HowtocoverIF/ELSEconditionwithAngular4Jasmineunittestcase【发布时间】:2018-05-2419:55:23【问题描述】:帮助我覆盖IF/Else覆盖范围和返回HTTP响应的方法以及构造函数以覆盖Jasmin... 查看详情

使用 Jasmine 和 TypeScript 进行单元测试

】使用Jasmine和TypeScript进行单元测试【英文标题】:UnittestingusingJasmineandTypeScript【发布时间】:2015-09-0100:49:49【问题描述】:我正在尝试使用Jasmine编译一个用Typescript编写的单元测试。在我的单元测试文件中包含以下内容后,Resha... 查看详情

Angular 7:如何在 Jasmine 单元测试中解决 Hammer.js 依赖项

】Angular7:如何在Jasmine单元测试中解决Hammer.js依赖项【英文标题】:Angular7:HowtoresolveHammer.jsdependencyinJasmineunittest【发布时间】:2020-11-0306:31:24【问题描述】:在为使用MaterialSlider并依赖HammerJS的组件编写单元测试时,我看到此错... 查看详情

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

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

使用 Angular Promise 进行 Jasmine 测试无法使用 TypeScript 解决

】使用AngularPromise进行Jasmine测试无法使用TypeScript解决【英文标题】:JasmineTestingwithAngularPromisenotresolvingwithTypeScript【发布时间】:2016-06-0104:10:49【问题描述】:我有一个针对Angular承诺的相当简单的测试,我在beforeEach函数中解决... 查看详情

使用 postMessage 和 addEventListener 进行 Jasmine 单元测试

】使用postMessage和addEventListener进行Jasmine单元测试【英文标题】:JasmineUnitTestwithpostMessageandaddEventListener【发布时间】:2015-09-1223:33:04【问题描述】:我正在尝试使用postMessage和addEventListener对情况进行单元测试。用例是我使用类似... 查看详情

使用jasmine和karma对传统js进行单元测试(代码片段)

当你拿到十五年前的一堆javascript的代码,你如何对这堆javascript代码写单元测试呢?于是就有了这篇文章。注意:不需要装任何现代化js框架,包括angular,react,vue之类的,都不需要装!!!先要... 查看详情

如何在不使用 Angular 的 spyOn 的情况下检查服务中的方法是不是在 Jasmine 单元测试中被调用?

...在不使用Angular的spyOn的情况下检查服务中的方法是不是在Jasmine单元测试中被调用?【英文标题】:HowtocheckifamethodfromaserviceiscalledornotinJasmineunittestingwithoutusingspyOninAngular?如何在不使用Angular的spyOn的情况下检查服务中的方法是否在J... 查看详情

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

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

使用 Angular 和 Jasmine/Karma 的私有方法进行测试和代码覆盖

】使用Angular和Jasmine/Karma的私有方法进行测试和代码覆盖【英文标题】:Testsandcode-coveragewithprivatemethodswithAngularandJasmine/Karma【发布时间】:2020-06-0219:06:18【问题描述】:所以,我在按钮组件上使用了这些方法。exportclassSidebarButtonC... 查看详情

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

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

使用 Jasmine 进行 Angular2 测试,mouseenter/mouseleave-test

】使用Jasmine进行Angular2测试,mouseenter/mouseleave-test【英文标题】:Angular2testingwithJasmine,mouseenter/mouseleave-test【发布时间】:2016-10-3008:52:58【问题描述】:我有一个HighlightDirective,它会在鼠标进入某个区域时突出显示,例如:@Directi... 查看详情