首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当使用autoSpy和ng-模拟时,如何重置茉莉花间谍呼叫?

当使用autoSpy和ng-模拟时,如何重置茉莉花间谍呼叫?
EN

Stack Overflow用户
提问于 2022-11-25 16:34:14
回答 2查看 28关注 0票数 2

我正在使用五模来嘲弄,到目前为止,除了一些怪癖之外,一切正常。

我使用autoSpy自动监视每个方法,所以我不必手动监视函数。所以根据文档,我在我的test.ts

代码语言:javascript
复制
ngMocks.autoSpy('jasmine');

我可以用间谍的方法来测试。例如,我有这样的东西:

代码语言:javascript
复制
// in the main beforeEach() while setting up TestBed
myService: MyService = MockService(MyService);

describe(`When button A is clicked`, () => {
  beforeEach(() => {
    //button click code here
  });

  it(`Should call functionA one time`, () => {
    expect(myService.functionA).toHaveBeenCalled(); // This works ok
  });

});

// Further down in the same file
describe(`When button B is clicked`, () => {
  beforeEach(() => {
    //button click code here
    
    ngMocks.reset(); // I don't think this does what I think it does
  });

  it(`Should NOT call functionA`, () => {
    expect(myService.functionA).not.toHaveBeenCalled(); // This DOES NOT work. 
  });

});

第二次,我试着测试这个函数不是用不同的按钮调用的,但是间谍计数了之前的调用,但是失败了。如果我只使用jit运行这个测试,那么它就通过了。或者,如果我将这个测试用例移到第一个测试用例之上,那么它就能工作了。我不能只做mySpy.calls.reset(),因为我没有手动指派间谍。我尝试过myService.functionA.calls.reset(),但是有一个错误-- functoinA没有calls方法,因为它没有被识别为间谍。

此外,如果我将调试器放在我的expect.not.toHaveBeenCalled()前面,并通过chrome窗口进行检查,我可以在控制台上运行这个myService.functionA.calls.reset(),然后它就可以正常工作了。

我该如何重设ng-mocks中的所有间谍电话?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-11-26 09:44:02

当一个函数/方法应该被模拟时,ngMocks.autoSpy('jasmine');只会调用jasmine.createSpy

这意味着您不需要重置它,因为每个测试都有自己的对象,因此也有自己的新间谍。

如果您的主beforeEach已经包含了MockService,则不应该进行任何额外的操作。它为服务创建了一个新的模拟。

代码语言:javascript
复制
// in the main beforeEach() while setting up TestBed
const myService = MockService(MyService);

您只需删除ngMocks.reset();

代码语言:javascript
复制
describe('root suite', () => {
  // in the main beforeEach() while setting up TestBed
  let myService: MyService

  beforeEach(() => myService = MockService(MyService));

  describe(`When button A is clicked`, () => {
    beforeEach(() => {
      //button click code here
    });

    it(`Should call functionA one time`, () => {
      expect(myService.functionA).toHaveBeenCalled(); // This works ok
    });
  });

  // Further down in the same file
  describe(`When button B is clicked`, () => {
    beforeEach(() => {
      //button click code here
    });

    it(`Should NOT call functionA`, () => {
      expect(myService.functionA).not.toHaveBeenCalled(); // This DOES NOT work. 
    });
  });
});

上面的代码确保每个测试都有自己新的MyService实例,这些实例都是未接触的间谍。

不过,您可以将现有间谍重置为任何其他茉莉间谍:

代码语言:javascript
复制
(myService.functionA as jasmine.Spy).calls.reset();
票数 1
EN

Stack Overflow用户

发布于 2022-11-25 16:54:29

我从未使用ng-模拟,但我查看了它们的文档和存储库。你试过使用ngMock.autoSpy('reset')吗?

如果您在这里查看:https://github.com/help-me-mom/ng-mocks/blob/dc91dd9948caf8208f9afeb9058b87a4eef9eecb/libs/ng-mocks/src/lib/mock-helper/mock-helper.auto-spy.ts

传递重置应该删除最后一个模拟,因此,如果您执行以下操作:

代码语言:javascript
复制
beforeEach(() => {
  ngMocks.autoSpy('jasmine');
});

.
.
.

afterEach(() => {
  ngMocks.autoSpy('reset');
});

也许能解决你的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74575655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档