角度模拟场/属性与Jasmine / Karma

问题描述 投票:0回答:3

我正在尝试测试一个使用Service的组件,该组件在方法的组件中调用。我需要根据测试来模拟和更改该属性。

我有这个:

export class XService{
  xProperty:boolean;
}

export class XComponent{

   ctor(private xService:XService){
   }

   xMethod():void{
     if(xService.xProperty){
         //some code
     }
   }
}

我尝试创建一个模拟并在beforeEach方法中添加属性

beforeEach(() => {
    /**more code**/
    xServiceMock = jasmine.createSpyObj(['xMethodService']);
    xServiceMock ['xProperty'] = false;
});

这很有效,直到我必须更改其中一个测试中的值。当我这样做时,值不会刷新。

it('x validation', () => {
    xServiceMock.xProperty = true;
    fixture.detectChanges();
    component.xMethod();<<<-- When it calls the method the change to TRUE is not refreshed
    expect(/****/).toBe(false);
  });

你知道我是否可以用Jasmine嘲笑那个属性?可能吗?

angular unit-testing jasmine karma-jasmine karma-runner
3个回答
0
投票

这可以帮助你:https://next.angular.io/guide/testing#always-get-the-service-from-an-injector

基本上当你在configureTestingModule中提供mock / spy / stub而不是真正的服务时,你需要在TestBed.get()之后获得它。


0
投票

在大多数情况下,使用TestBed测试Angular服务会导致过载。检查我的答案here


0
投票

你可以使用模拟器来提供服务

class MockXService extends XService{
   xProperty = false; // set a fake value here    
}

以这种方式将服务添加到提供者

beforeEach(async(() => {
TestBed.configureTestingModule({
  ...,
   declarations: [XComponent],
  providers: [
    { provide: XService, useClass: MockXService },
  ],

})

和你的考试

it('x validation', () => {
fixture.detectChanges();
component.xMethod();<<<-- When it calls the method the change to TRUE is not refreshed
expect(/****/).toBe(false);
});
© www.soinside.com 2019 - 2024. All rights reserved.