2016-05-26 32 views
2

我想窥探一个承诺,并在我的单元测试中伪造承诺,但问题是如果我首先运行构造函数,他首先运行承诺并运行Spyon。spyOn构造函数与茉莉花的方法

但是,当我第一次运行spyOn,然后构造它会给出一个错误,存储是未定义的。

有人知道如何解决这个问题吗?

规格文件:

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

“容易”第一种方法可能是您注入存储而不是在构造函数中创建一个实例。然后,您可以在调用构造函数 – iberbeu

+0

之前模拟此注入的存储空间您是否有示例? – mbakker1996

+0

你将'SettingsService'实现为一个角度服务,然后将它注入到你的类中:类型'static $ inject = ['settingsService'];构造函数(private settingsService:SettingsService){...}'然后你可以用'$ injector.get('settingsService')'在你的测试中得到这个服务的一个副本,并模拟它或者窥探它 – iberbeu

回答

1

的PROBL您拥有的是您在构造函数中实例化Storage,因此您无法从外部访问它。这意味着你不能嘲笑它。

设置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')当你的承诺和测试的行为。

使存储服务和注入模拟:如果你使用这种方法,你可以moke存储,因此嘲笑this.storage.get('url')的行为。类``的代码看起来像这样

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

但这种方式取决于你怎么定义和使用Storage所以一般第一种方式会更好

+0

这是为角1,但我用角2 – mbakker1996

+0

好点,我没有看到标签。无论如何,我认为会有很大的不同 – iberbeu