模块清除:
angular.module('destination-filter',['ngSanitize']);
除非我删除ngSanitize作为依赖项,否则我的测试会失败.据我所知,这是因为当模块被实例化时,它会尝试并引入该依赖项,但因为在我的spec.js文件中我没有声明该模块失败.
规格文件:
describe('Destination Filter Controller',function () { // Set the variables var $controller; var mockNgSanitize; beforeEach(module('destination-filter')); beforeEach(function() { module(function($provide) { $provide.value('ngSanitize',mockNgSanitize); }); }); beforeEach(inject(function (_$controller_) { $controller = _$controller_('DestinationFilterController'); })); it('should expect the controller to not be null',function() { // Check the controller is set expect($controller).not.toBeNull(); });
});
以前,在模拟服务或函数时,$provide方法已被证明非常有用,但我不确定我在这里使用它是否正确.我假设以这种方式使用的$offer不能模拟整个模块而是服务?
为了澄清,如果我从模块减速中删除… [‘ngSantize’])…,测试会正确实例化.我收到的错误是错误:[$injector:modulerr] destination-filter
>将服务注入您的测试
>在ngSanitize上存根方法调用
>模拟整个ngSanitize服务
您选择的选项实际上取决于在您的工作代码中使用ngSanitize(而不是您的测试代码).
无论你选择哪一个,你都需要在测试中提供服务,不需要$provider(这包括选项1,如果你只是想让你的过滤器可以使用它,则不需要做任何更多) ):
beforeEach(module('ngSanitize')); beforeEach(inject(function(_ngSanitize_) { // the underscores are needed mockNgSanitize = _ngSanitize_; }));
此外,确保所有js文件都被业力拾取并加载.您可以在karma.conf.js中将它们添加到files:property中来定义它.
2.在服务上存根方法
我喜欢存根,在编写测试时发现它们非常有用.你的测试应该只测试一件事,在你的情况下是一个过滤器.存根使您可以更好地控制测试,并允许您隔离测试中的事物.
通常过滤器,控制器,任何东西都会调用许多其他东西(服务或工厂,如$http或ngSanitize).
假设您的过滤器使用ngSanitize的$sanitize来清理某些html,您可以使用该方法来返回已定义的已清除的html,以测试您的期望:
// in a beforeEach spyOn(mockNgSanitize,"$sanitize").and.returnValue('<some>sanitized<html>'); mockNgSanitized.$sanitize(yourDirtyHtml);
你可能不得不玩间谍服务,但这应该可行.
3.模拟整个服务
我不认为你想要使用这个选项,因为它会让你疯狂搞清楚什么需要嘲笑加上模拟可以创造不切实际的期望,而且对你的用例并不是特别有用.如果你真的想要去,那么像下面这样的东西正朝着正确的方向前进(see the jasmine docs)
beforeEach(function() { mockNgSanitize = ('ngSanitize',['linky','$sanitize','$sanitizeProvider']; }); it('mocks the ngSanitize service',function() { expect(mockNgSanitize.linky).toBeDefined(); });
注意:在上面的所有代码中,请确保继续在describe块的顶部声明任何变量.