【问题标题】:jasmine spy on nested object茉莉花间谍嵌套对象
【发布时间】:2013-06-15 06:37:43
【问题描述】:

我的服务对象如下所示:

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

我想模拟 appService,比如:

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

我该怎么做呢?

【问题讨论】:

  • 你应该接受一个答案。这里有 2 个有效

标签: javascript unit-testing jasmine


【解决方案1】:

好的,我得到了这个:

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

我希望这是正确的做法。

【讨论】:

  • 这是最佳方法。其中'get''query' 都是间谍方法。因此,像expect(appService.serviceTwo.query).toHaveBeenCalled() 这样的东西是可用的。
【解决方案2】:

只需将函数替换为茉莉间谍:

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

稍后:

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

【讨论】:

  • 如果你想spyOn 而不是这样做,这可能吗?
【解决方案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');

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

【讨论】:

    【解决方案4】:

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

    对于深度嵌套的对象:

    var appService = {
     serviceOne: {
       get: function(){}
     }
    };
    
    jasmine.spyOn(appService.serviceOne, 'get');
    
    expect(appService.serviceOne.get).toHaveBeenCalled();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-25
      • 2012-08-15
      • 2014-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多