微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在不使用特定于Jasmine的inject()的情况下将依赖项注入AngularJS控制器测试

我试图将我的大脑包裹在AngularJS中的依赖注入中.让我们说这是我非常激动人心的应用程序代码
function PrideRockCtrl($scope,King) {
  $scope.king = King;
}

angular.module('Characters',['ngResource'])
  .factory('King',function() {
    return "Mufasa";
  });

我想测试PrideRockCtrl.如果我按照文档和教程中的示例进行操作,我可以使用模块(‘Characters’)配置注入器并使用inject()来获取一些依赖项.即:

describe('Pride Rock',function() {
  beforeEach(module('Characters'));
  it('should be ruled by Simba',inject(function($rootScope,$controller) {
    var scope = $rootScope.$new();
    var ctrl = $controller(PrideRockCtrl,{$scope: scope});
    expect(scope.king).toEqual("Mufasa");
  }));
});

这很好,但这不是一个交叉测试框架解决方案. module()和inject()测试助手只与Jasmine兼容.

在不使用module()或inject()的情况下手动完成相同依赖注入的最佳方法是什么?

我想出了这个:

describe('Pride Rock',function() {
  it('should be ruled by Mufasa',function() {
    var $injector = angular.injector(['Characters']);
    var $controller = $injector.get('$controller');
    var scope = $injector.get('$rootScope').$new();
    var king = $injector.get('King');
    var ctrl = $controller(PrideRockCtrl,{$scope: scope,King: king});
    expect(scope.king).toEqual("Mufasa");
  });
});

这看起来非常冗长.有没有更好的办法?

jsfiddlehttp://jsfiddle.net/johnlindquist/d63Y3/

最简单的版本,不使用模块将如下所示:
describe('Pride Rock',function() {

    it('should be ruled by Simba',$controller) {
        var scope = $rootScope.$new();
        var ctrl = $controller(PrideRockCtrl,{
            $scope: scope,King:"Mufasa"
        });
        expect(scope.king).toEqual("Mufasa");
    }));
});

事实上,你的尝试非常接近,唯一缺少的是控制器中的本地依赖(King:“Mufasa”).

在那些测试中,我们专注于一个选定的类,只是没有必要使用$injector,因为我们可以手动模拟/存根我们的依赖项.在一天结束时,$injector只是给出了对象的实例,所以我们也可以创建自己的对象.

原文地址:https://www.jb51.cc/javaschema/281612.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐