11

我的服务对象如下所示:

var appService = {
 serviceOne: {
   get: function(){}
 },
 serviceTwo: {
  query: function(){}
 }
}

我想模拟 appService,例如:

expect(appService.serviceTwo.query).toHaveBeenCalled();

我该怎么做呢?

4

4 回答 4

16

好的,我得到了这个:

appService: {
  serviceOne: jasmine.createSpyObj('serviceOne', ['get']),
  serviceTwo: jasmine.createSpyObj('serviceTwo', ['query'])
}

我希望这是正确的做法。

于 2013-06-15T07:12:42.427 回答
6

只需将函数替换为 jasmine 间谍:

var appService = {
  serviceOne: {
    get: jasmine.createSpy()
  },
  serviceTwo: {
    query: jasmine.createSpy()
  }
}

稍后的:

expect(appService.serviceTwo.query).toHaveBeenCalled()
于 2013-06-15T08:54:25.440 回答
3

我遇到了一个非常相似的问题,并找到了一个可以相对轻松地在多个级别进行间谍活动的解决方案。

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');

注意:此代码未经测试;但是,我在我的一个应用程序中有一个非常相似的实现。希望这可以帮助!

于 2016-04-26T18:24:35.920 回答
1

上面的示例显示了显式的命名间谍创建。但是,可以简单地继续在jasmine.spyOn函数中进行链接以到达方法级别。

对于深度嵌套的对象:

var appService = {
 serviceOne: {
   get: function(){}
 }
};

jasmine.spyOn(appService.serviceOne, 'get');

expect(appService.serviceOne.get).toHaveBeenCalled();
于 2018-03-12T22:37:10.147 回答