在测试Angular服务时,如何使用该服务模拟控制器?

时间:2014-02-05 17:11:51

标签: javascript angularjs unit-testing jasmine

我有一个由不同控制器使用的Angular服务。它包含一个期望任何控制器实例作为参数的方法。

myService.methodAbc( ctrl );

我知道如何为服务设置Jasmine规范,但在我的规范中设置一个假控制器时我感到很茫然,所以我可以测试一下这个方法。使用其中一个应用程序的现有控制器感觉不对,因为我的服务测试会破坏我重命名/更改/删除控制器。

任何输入都将不胜感激。我觉得我在这里遗漏了一些明显的东西。

1 个答案:

答案 0 :(得分:1)

您可以传入一个普通的对象来充当假控制器。就个人而言,我更喜欢使用SinonJS为方法创建存根,因为它允许您的测试断言myServicectrl的交互方式。 Jasmine有自己的假对象方法,我不熟悉哪些方法也可以使用。以下是使用SinonJS(and a library which integrates it with Jasmine)时的外观:

var fakeController = {
    someMethod: sinon.stub(), 
    anotherMethod: sinon.stub() 
};
myService.methodAbc(fakeController);

expect(fakeController.someMethod).toHaveBeenCalledWith('foo', 'bar');

<强>更新

以下是使用原生Jasmine库执行相同操作的方法:

var fakeController = jasmine.createSpyObj(
    'fakeController', 
    ['someMethod', 'anotherMethod']);

myService.methodAbc(fakeController);

expect(fakeController.someMethod).toHaveBeenCalledWith('foo', 'bar');