Javascript jasmine监视嵌套对象
我的服务对象如下所示:Javascript jasmine监视嵌套对象,javascript,unit-testing,jasmine,Javascript,Unit Testing,Jasmine,我的服务对象如下所示: var appService = { serviceOne: { get: function(){} }, serviceTwo: { query: function(){} } } 我想模拟appService,类似于: expect(appService.serviceTwo.query).toHaveBeenCalled(); 我该怎么做呢?好的,我用这个解决了这个问题: appService: { serviceOne: jasmine.
var appService = {
serviceOne: {
get: function(){}
},
serviceTwo: {
query: function(){}
}
}
我想模拟appService,类似于:
expect(appService.serviceTwo.query).toHaveBeenCalled();
我该怎么做呢?好的,我用这个解决了这个问题:
appService: {
serviceOne: jasmine.createSpyObj('serviceOne', ['get']),
serviceTwo: jasmine.createSpyObj('serviceTwo', ['query'])
}
我希望这是正确的方法。只需用jasmine spies替换该功能即可:
var appService = {
serviceOne: {
get: jasmine.createSpy()
},
serviceTwo: {
query: jasmine.createSpy()
}
}
稍后:
expect(appService.serviceTwo.query).toHaveBeenCalled()
我遇到了一个非常类似的问题,并得到了一个工作解决方案,允许在多个级别上相对容易地进行间谍活动
appService = {
serviceOne: jasmine.createSpy().and.returnValue({
get: jasmine.createSpy()
},
serviceTwo: jasmine.createSpy().and.returnValue({
query: jasmine.createSpy()
}
}
此解决方案允许在单元测试中调用以下代码
expect(appService.serviceOne).toHaveBeenCalledWith('foobar');
expect(appService.serviceOne().get).toHaveBeenCalledWith('some', 'params');
注:此代码未经测试;然而,我的一个应用程序中有一个非常相似的实现。希望这有帮助 上面的示例显示了显式的、命名为spy的创建。但是,您可以简单地在
jasmine.spyOn
函数中继续链接,以达到方法级别
对于深度嵌套对象:
var appService = {
serviceOne: {
get: function(){}
}
};
jasmine.spyOn(appService.serviceOne, 'get');
expect(appService.serviceOne.get).toHaveBeenCalled();
这是最佳方法。在它中,
'get'
和'query'
都是间谍方法。因此,类似于expect(appService.serviceTwo.query).toHaveBeenCalled()
的功能是可用的。如果您想spyOn
而不是这样做,那会怎么样?可能吗?您应该接受答案。这里有两个工作