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
而不是这样做,那会怎么样?可能吗?您应该接受答案。这里有两个工作