Наблюдаемое свойство шпиона заполнено в конструкторе службы в угловых - PullRequest
0 голосов
/ 19 февраля 2019

Я пытаюсь выполнить модульный тест для компонента, который подписывается на наблюдаемое свойство внедренного сервиса, назначенное в конструкторе сервиса.Я пытался с spyOnProperty, но не работает, также подделка службы с собственностью, но без удачи.Что я делаю не так?

Это мой SellProductService:

@Injectable({
  providedIn: 'root'
})
export class SellProductService{
  $soldProducts: Observable<Array<Product>>;

  constructor(private store: Store<any>, private http: HttpClient) {
    this.$soldProducts= this.store.select('sold');
  }

  getAll() {
    // Some cool httpClient method
  }
}

В конструкторе моего компонента я подписываюсь на эту переменную, чтобы получить массив продуктов.

soldProducts: Array<Product> = [];

  constructor(public store: Store<any>,
              public sellProductService: SellProductService) {

      this.sellProductService.$soldProducts.subscribe((soldProduct: Array<Product>) => {
        this.soldProducts = soldProduct;
      });

    }

Я изменил некоторые имена переменных только для демонстрационных целей, пожалуйста, не обращайте внимания на соглашение об именах.

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

Это моя последняя версия моего модульного теста.

const fakeSoldProducts: Array<Products> = [
  {
    id: 33,
    description: null,
    label: "My Cool model name"
  },
  {
    id: 34,
    description: null,
    label: "My Cool model name 2"
  }
  }];

describe('ViewProductsComponent', () => {
  let component: ViewProductsComponent;
  let store: Store<any>;
  let fixture: ComponentFixture<ViewProductsComponent>;
  let sellProductService: SellProductService;
  let http: HttpClient;
  const fakeProduct = fakeSoldProducts;

  // This is how I was faking the service previously
  const fakeSellProductService = {
    $soldProducts: new BehaviorSubject<Array<Product>>(fakeSoldProducts)
  }

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [ViewProductsComponent],
      providers: [
        {provide: HttpClient, useValue: {}},
        {provide: Store, useClass: TestStore},
        SellProductService
      ],
      schemas: [NO_ERRORS_SCHEMA]
    }).compileComponents();
  }));

  beforeEach(() => {
    fixture = TestBed.createComponent(ViewProductsComponent);
    component = fixture.componentInstance;
    sellProductService = new SellProductService(store, http);
  });

  it('Should have a list of sold products', async(() => {
    let spy = spyOnProperty(sellProductService, "$soldProducts", 'get').and.returnValue(timer(1000).pipe(mapTo(fakeSoldProducts)));
    sellProductService.$soldProducts.subscribe((soldProducts: Array<Product>) => {
      expect(soldProducts).toEqual(fakeSoldProducts);
    });

    tick();
    discardPeriodicTasks();
  }));


});

Когда я запускаю тест, я получаю следующие ошибки:

enter image description here

Я прочитал, что spyOnProperty нужны методы get для доступа к значениям свойств, но я не могу изменить службу, потому что она используется во многихместа в приложении.Кто-нибудь может подсказать мне, как правильно проверить это наблюдаемое свойство?

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