【问题标题】:How to reset a spy in Jasmine?如何在茉莉花中重置间谍?
【发布时间】:2019-06-22 11:04:06
【问题描述】:

我有一个问题,我将模拟服务设置为间谍。

 mockSelectionsService = jasmine.createSpyObj(['updateSelections']);

然后我调用该存根方法两次,每次都在不同的测试中。问题是当我 expect() 带有 .toHaveBeenCalledWith() 的间谍时,toHaveBeenCalledWith 方法还包含它从第一个测试传递的参数,这在我的第二个测试中产生了误报。

我如何擦除/清除/重置 spyObject 以进行下一次测试,使其不再相信它已被调用?

服务/组件的初始化

  beforeEach(() => {
    mockSelectionsService = jasmine.createSpyObj(['updateSelections']);

    TestBed.configureTestingModule({
      declarations: [QuickSearchComponent, LoaderComponent, SearchComponent, SearchPipe, OrderByPipe],
      providers: [OrderByPipe, SearchPipe, SlicePipe, {provide: SelectionsService, useValue: mockSelectionsService}],
      imports: [FormsModule, HttpClientModule]
    });


    fixture = TestBed.createComponent(QuickSearchComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();

    fixture.componentInstance.templates = mockTemplates;
    fixture.componentInstance.manufacturers = mockManufacturers;
  });

【问题讨论】:

  • 在 beforeEach 中添加你的间谍对象初始化
  • 我尝试在描述的 beforeEach() 中使用 mockSelectionsService = jasmine.createSpyObj(['updateSelections']); 重新初始化对象,但这似乎不起作用。我注意到似乎有很多不同的方法可以创建间谍,但 jasmine 文档/api 并没有完全给出答案。我已经更新了我的答案以在我的第一个 beforeEach() 中显示初始化

标签: javascript angular jasmine


【解决方案1】:

const spy = spyOn(somethingService, "doSomething");

spy.calls.reset();

这将重置已对间谍进行的调用。这样您就可以在测试之间重用间谍。另一种方法是将测试嵌套在另一个 describe() 中,并将 beforeEach() 也放入其中。

【讨论】:

  • 在我的 beforeEach() 中尝试 mockSelectionsService.calls.reset() 时得到 Cannot read property 'reset' of undefined
  • 当你创建间谍对象时,你需要调用类似下面的东西来重置 mockSelectionsService.method.calls.reset();
【解决方案2】:

类型 1:

var myService = jasmine.createSpyObj('MyService', ['updateSelections']);

myService.updateSelections.calls.reset();


类型 2:

var myService = spyOn(MyService, 'updateSelections');

myService.updateSelections.calls.reset();

注意:上面的代码是在 Jasmine 3.5 上测试的

【讨论】:

    【解决方案3】:

    默认返回值的mock服务可以在beforeEach()中设置,但是如果以后想改变mocked服务响应,不要在beforEach中调用fixture.detectChanges(),可以在每个spec中调用在应用所需的更改(如果有的话)之后,如果您想更改特定规范中的模拟服务响应,则将其添加到该规范之前的 fixture.detectChanges()

      beforeEach(() => {
        serviceSpy = jasmine.createSpyObj('RealService', ['methodName']);
        serviceSpy.methodName.and.returnValue(defaultResponse);
    
        TestBed.configureTestingModule({
          providers: [{provide: RealService, useValue: serviceSpy }],
        ...
        })
        ...
    
        fixture = TestBed.createComponent(MyComponent);
        component = fixture.componentInstance;
        // do not call fixture.detectChanges() here
      });
    
      it('test something with default mocked service response', () => {
          fixture.detectChanges();
          ....
      });
    
      it('test something with a new mocked service response', () => {
          serviceSpy.methodName.and.returnValue(newResponse);
          fixture.detectChanges();
          ....
      });
    

    【讨论】:

    • 从 serviceSpy.and.returnValue(newResponse) 开始工作
    【解决方案4】:

    添加到 Jelle 的答案中,如果您有 Cannot read property 'reset' of undefined when attempting mockSelectionsService.calls.reset(),请尝试:

    const spy = spyOn(somethingService, "doSomething");
    spy.mockRestore(); 
    

    参考:jest spyon 演示:https://jestjs.io/docs/en/jest-object#jestspyonobject-methodname

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-25
      • 2012-08-15
      • 1970-01-01
      • 2014-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多