Angular 6 Testing Jasmine Karma: провайдер переопределения не работает - PullRequest
0 голосов
/ 22 октября 2018

Итак, я посмотрел на многие проблемы в Интернете, в том числе этот https://github.com/angular/quickstart/issues/320, и я в замешательстве ...

Как я настроил свой код, так это то, что у меня есть основное описание созданиямой компонент испытательного стенда, здесь у меня есть mockParams, настроенный для активного маршрута, поэтому мы можем this.route.queryparams.subscribe (..), Моя проблема в том, что я не могу перезаписать значения в другом блоке description или 'it'.

 beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [MyComponent],
      imports: [RouterTestingModule
        })],
      providers: [
        { provide: ActivatedRoute, useValue: mockParams },
      ],
      schemas: [NO_ERRORS_SCHEMA]
    }).compileComponents();
}));

Вот пример того, как я добавляю переопределение в другой блок описания NESTED ...

beforeEach(() => {
      TestBed.overrideProvider(ActivatedRoute, 
      {useValue: newMockParams});
      TestBed.compileComponents();
      fixture = TestBed.createComponent(MyComponent);
      component = fixture.componentInstance;
      fixture.detectChanges();
});

Это похоже на то, что он вообще не запускается ... новыйПараметры mock не меняются, если я повторно использую mockParams и изменяю значения, тогда это изменит значение в исходном описании. Действительно ли мне нужно заново создавать свой компонент в каждом вложенном описании?Это просто не правильно, что я должен был бы сделать это, когда единственное, что мне нужно изменить, это провайдер, я не уверен, что overrideProvider даже делает на этом этапе!Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 24 октября 2018

Обновлено с новой информацией, представленной в комментариях ниже.

Я предлагаю изменить значение, возвращаемое route.queryParams.Вы упомянули в комментариях, что ваша функция ngOnInit () выглядит следующим образом:

ngOnInit() {
    this.route.queryParams.subscribe(params => { this.value = params; });
}

Если вы измените возвращаемое значение из наблюдаемого queryParams перед запуском .detectChanges () в каждом тесте, это должно достичь того, что вы хотите,Например, что-то вроде этого:

describe('MyComponent', () => {
    let mockActivatedRoute = {queryParams: of({old: 'test'})};
    let component: MyComponent;
    let fixture: ComponentFixture<MyComponent>;
    let route: ActivatedRoute;

    beforeEach(async(() => {
        TestBed.configureTestingModule({
            declarations: [MyComponent],
            imports: [ ],
            providers: [
                { provide: ActivatedRoute, useValue: mockActivatedRoute },
            ]
        })
        .compileComponents();
    }));

    beforeEach(() => {
        fixture = TestBed.createComponent(MyComponent);
        component = fixture.componentInstance;
        route = TestBed.get(ActivatedRoute);
    });

    it('ngOnInit should initialize and route params be intial values', () => {
        fixture.detectChanges(); // execute ngOnInit() in component
        expect(component.value).toEqual({old: 'test'}); // check that value is correct
    });
        it('ngOnInit should initialize and route params be changed values', () => {
        route.queryParams = of({new: 'newTest'/* mocked params */});
        fixture.detectChanges();
        expect(component.value).toEqual({new: 'newTest'}); // check that value is correct
    });
});

Я проверил все это в стеке, чтобы убедиться, что все это работает без ошибок.:) Вот ссылка: STACKBLITZ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...