2016-05-26 4 views
2

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

Но когда я сначала запускаю spyOn, а затем конструктор, он дает ошибку, что хранилище не определено.

Кто-нибудь знает, как это исправить?

Spec файла:

describe('Settings Service',() => { 

    beforeEach(() => { 
     settingsService = new SettingsService(); // This gives a error beceause it runs the promise 
     spyOn(settingsService.storage, 'get').and.callFake((key: String): Promise<string> => { 
      return new Promise((resolve, reject) => { resolve('url'); }); 
     }); 
    }); 

конструктор:

constructor() { 
     this.storage = new Storage(LocalStorage); 
     this.storage.get('url').then(data => { 
      this.setLink(data); 
     }); 
    } 

UPDATE:

Я попытался также это:

let injector: any = ReflectiveInjector.resolveAndCreate([SettingsService]); 
    settingsService = injector.get(SettingsService); 

    spyOn(settingsService.storage, 'get').and.callFake((key: String): Promise<string> => { 
     return new Promise((resolve, reject) => { resolve('https://secure.info/pascal'); }); 
    }); 
+2

«легкий» первый подход может быть, вы добавляете Storage вместо создания экземпляра в конструкторе. Затем вы можете издеваться над этим вложенным хранилищем перед вызовом конструктора – iberbeu

+0

У вас есть пример? – mbakker1996

+0

вы реализуете 'SettingsService' как угловую службу, а затем вводите ее в свой класс: вид' static $ injection = ['settingsService']; constructor (private settingsService: SettingsService) {...} 'Тогда вы можете получить копию этой службы в своих тестах с помощью' $ injector.get ('settingsService') 'и высмеять ее или заглянуть в нее – iberbeu

ответ

1

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

Установка spyOn перед вызовом settingsService = new SettingsService(); не работает либо потому, что хранилище полей еще не создано.

У вас есть два пути решения этого:

насмешливый обслуживание $ httpBackend используя следующий код. Посмотрите на this post как пример

beforeEach(inject(function($injector) { 
    service = $injector.get('carService'); 
    $httpBackend = $injector.get('$httpBackend'); 

    $httpBackend.when('GET', "/api/cars/types").respond(["Toyota", "Honda", "Tesla"]); 
})); 

Таким образом, вы можете издеваться обещание вы получите при вызове this.storage.get('url') и проверить поведение.

Создание ХРАНЕНИЯ службы и инъекционный он издевался: Если вы используете этот подход, вы можете Мок хранения и, следовательно, издеваться поведением this.storage.get('url'). Код вашего класса `` будет выглядеть следующим образом

static $inject = ['Storage']; 
constructor(storage: Storage) { 
    this.storage = storage; 
    this.storage.get('url').then(data => { 
     this.setLink(data); 
    }); 
} 

Но этот путь зависит от того, как вы определяете и использовать для хранения, так как правило, первый способ будет лучше

+0

Это для углового 1, но я использую угловой 2 – mbakker1996

+0

Хороший момент, я не видел тег. Думаю, будет много – iberbeu

Смежные вопросы