茉莉花/因果的角模拟场/属性

时间:2018-10-20 16:10:13

标签: angular unit-testing jasmine karma-jasmine karma-runner

我正在尝试测试使用服务的组件,该组件具有在方法的组件内部调用的属性。我需要根据测试来模拟和更改该属性。

我有这个:

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);
  });

您知道我是否可以用茉莉花来嘲笑那个财产吗?有可能吗?

3 个答案:

答案 0 :(得分:0)

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

基本上,当您在configureTestingModule中提供模拟/间谍/存根而不是真实服务时,需要在以后使用TestBed.get()来获得它。

答案 1 :(得分:0)

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

答案 2 :(得分: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);
});