#angular #unit-testing #ionic-framework
#angular #модульное тестирование #ionic-framework
Вопрос:
Я пытаюсь создать макет сервиса, но я получаю сообщение об ошибке «Типы имеют отдельные объявления частного свойства», мне кажется, что объявление равно, а не отличается, но в нем говорится, что ошибки нет. Я выполняю этот тест в компоненте, в который внедрен сервис!!! Да, я хочу протестировать это здесь с помощью макетного теста.
Мой код для макета сервиса:
class MockDataservice {
result: any;
constructor(private http: HttpClient){
sendCodeToServer() {
return this.result;
}
}
describe('HomePage', () =>
...
{
...
beforeEach(() => {
...
service = new MockDataservice(http);
component = new HomePage(platform, service, splash, statusbar, barcode, alert, http, loading, router);
Исходный сервис:
export class DataStorageService {
result: any;
constructor(private http: HttpClient) {
}
sendToServer(data) {
const headers = new HttpHeaders().set('Content-Type', 'application/json');
return new Promise((resolve, reject) => {
this.http.post(endpoindURL, data, { headers: headers })
.toPromise().then((data) => {
resolve(data);
}).catch((err) => {
console.log(err);
reject(err);
});
});
}
}
Использование сервиса в компоненте:
export class HomePage {
barcodeScannerOptions: BarcodeScannerOptions;
constructor(private platform: Platform, private **dataStorageService**:
DataStorageService,
private splashScreen: SplashScreen,
private statusBar: StatusBar, private barcodeScanner: BarcodeScanner, public
alertController: AlertController,
private http: HttpClient, private loadingController: LoadingController,
private router: Router) {
this.initializeApp();
this.barcodeScannerOptions = {
showTorchButton: true,
showFlipCameraButton: true
};
}
function doesSomething(){
this.dataStorageService.sendToServer(data).then((res) => {
}
Я получаю ошибку здесь, в файле home.spec, в слове service
компонент = новая домашняя страница (платформа, сервис, заставка, строка состояния, штрих-код, оповещение, http, загрузка, маршрутизатор);
и ошибка
MockDataservice не может быть присвоен параметру типа //DataStorageService. Типы имеют отдельные объявления частной собственности http.ts
Комментарии:
1. можете ли вы правильно отформатировать свой код, пожалуйста?
2. @fjc теперь он правильно отформатирован, не могли бы вы присесть и взглянуть?
3. Есть ли причина, по которой вы вручную создаете экземпляр тестируемого модуля вместо того, чтобы разрешать
Testbed
это делать?4. Ознакомьтесь с моим ответом ниже
Ответ №1:
Итак, вот исчерпывающий ответ на то, что происходит. Я сконструировал минимальный пример, который воспроизводит поведение: Сломанный пример на TypeScript Playground. На самом деле вы можете увидеть точно такое же сообщение об ошибке.
Что здесь происходит? Component
Ожидает экземпляр фактического Service
класса в своем конструкторе. MockService
не является Service
. Он просто по совпадению имеет те же параметры конструктора и те же имена методов. Компилятор не знает, что эти два устройства на самом деле совместимы (т. е. реализуют один и тот же интерфейс), и поэтому выдает ошибку.
Как нам это исправить? Работайте с реальной объектно-ориентированной абстракцией. Поскольку Service
и MockService
на самом деле взаимозаменяемы, нам нужно сообщить об этом компилятору. Как нам это сделать? Благодаря тому, что они реализуют один и тот же интерфейс.
Мы просто определим Service
интерфейс. У нас будет ConcreteService
, который содержит поведение по умолчанию и который реализует Service
. У нас также будет наш, MockService
который будет реализовывать то же самое Service
, но с имитацией поведения: Рабочий пример на TypeScript playground.,
Комментарии:
1. большое вам спасибо за ответ на мой вопрос! это мне очень помогает