Я пытаюсь выполнить модульный тест для компонента, который подписывается на наблюдаемое свойство внедренного сервиса, назначенное в конструкторе сервиса.Я пытался с 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();
}));
});
Когда я запускаю тест, я получаю следующие ошибки:
Я прочитал, что spyOnProperty нужны методы get для доступа к значениям свойств, но я не могу изменить службу, потому что она используется во многихместа в приложении.Кто-нибудь может подсказать мне, как правильно проверить это наблюдаемое свойство?