Угловое поле Mock / собственность с Жасмин / Карма - PullRequest
0 голосов
/ 20 октября 2018

Я пытаюсь протестировать компонент, который использует Сервис со свойством, вызываемым внутри компонента метода.Мне нужно смоделировать и изменить это свойство в зависимости от теста.

У меня есть это:

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 голосов
/ 25 марта 2019

Использование TestBed для тестирования сервисов Angular в большинстве случаев приводит к перегрузке.Проверьте мой ответ здесь

0 голосов
/ 25 марта 2019

вы можете использовать макет для вашего сервиса

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);
});
0 голосов
/ 20 октября 2018

Это может помочь вам: https://next.angular.io/guide/testing#always-get-the-service-from-an-injector

В основном, когда вы предоставляете имитирующий / шпионский / заглушку вместо реального сервиса в configureTestingModule, вам необходимо получить его впоследствии с помощью TestBed.get().

...