0

我是 Angular 中 Jasmine 单元测试的新手。

我目前正在测试一个服务,它有一个名为loadSomething(id)的函数,并且我在其中添加了一个 console.info。

我的服务:

function loadSomething(id)
{
    console.info('this is a test message');
    return (a promise from a POST request)
}

这是我的测试(规格)文件:

//verify that the load function exists
it('load snapshot',function(){

  expect(MyService.loadSomething(108)); //statement 1
  spyOn(MyService, 'loadSomething').and.callThrough(); //statement 2
});

所以,我在网上看到 SpyOn 的 callthrough 方法调用了 ACTUAL 函数。但是,当我使用期望语句(语句 1)运行测试时,会调用 console.info 消息(工作正常)。另一方面,当我注释掉语句 1 并取消注释 SpyOn(statement 2) 时,我不再收到 console.info 消息。

我预计会发生完全相反的情况。我在这里理解错了吗?

(其余代码工作正常,无论是规范文件还是实际服务,我只是没有真正了解这个具体的东西)

4

1 回答 1

1

SpyOn 将帮助您设置函数在测试中被调用时的反应方式。基本上它是创建模拟的茉莉花方式。

在您的情况下,您已经定义了在调用服务功能时测试应该做什么,即 callThrough。问题是您还需要对服务函数(或调用服务方法的范围函数)采取行动,以触发将调用的 SpyOn

it('load snapshot',function(){

  //setup
  spyOn(MyService, 'loadSomething').and.callThrough(); //statement 2

  //act

  //either call the scope function which uses the service 
  //$scope.yourServiceCallFunction();

  //or call the service function directly
  MyService.loadSomething(1); //this will callThrough

});

这是一个简单的测试,我们将模拟 SpyOn 对字符串的响应

it('test loadSomething',function(){

  //setup
  spyOn(MyService, 'loadSomething').and.returnValue('Mocked');

  //act
  var val = MyService.loadSomething(1);

  //check
  expect(val).toEqual('Mocked');
});
于 2017-05-16T20:18:23.347 回答