【问题标题】:Proper way to write code for Angular to allow unit testing为 Angular 编写代码以允许单元测试的正确方法
【发布时间】:2016-07-26 21:42:51
【问题描述】:

我很难理解我应该如何为 Angular.js 控制器编写方法以允许完成单元测试。互联网上的所有教程都很简单,并没有显示它在现实生活中的应用程序是什么样子。这些教程显示所有方法都是通过将它们附加到“范围”或“this(aka vm)”来公开的。在我的理解中,不会在控制器之外使用的方法不需要暴露。在下面的示例中,我只公开了两种方法,因为它们是通过单击页面上的按钮来触发的。其余方法仅用于内部目的。 如何在不暴露控制器的情况下测试控制器中的私有方法?我是否需要公开所有这些才能进行单元测试?公开所有方法是一种好习惯吗?谢谢

angular.module('app.pool',[])
  .controller('PoolController', PoolController);

function PoolController(PoolService) {
    var vm = this;

    vm.candidateName='';
    vm.candidatePicUrl='';

    vm.approveCandidate = approveCandidate;
    vm.refuseCandidate = refuseCandidate;

    function approveCandidate() {
        PoolService.approveCandidate();
        getNextCandidate();
    }

    function refuseCandidate() {
        PoolService.refuseCandidate();
        getNextCandidate();
    }

    function getNextCandidate() {
        clearProfile();
        PoolService.getNextCandidate().
        success(displayUserData);
    }

    function displayUserData(data) {
        vm.candidateName = getCandidateName(data);
        vm.candidatePicUrl = getCandidateProfilePic(data);
    }

    function getCandidateName(data) {
        return data.userName;
    }

    function getCandidateProfilePic(data) {
        return changeUrlToBiggerPic(data.profilePicture);
    }

    function changeUrlToBiggerPic(url) {
        return url.replace('s150x150', 's600x600');
    }

    function clearProfile() {
        vm.candidateName = "";
        vm.candidatePicUrl = "";
    }

}

【问题讨论】:

    标签: angularjs unit-testing angular-controller


    【解决方案1】:

    仅仅为了单元测试而公开私有方法绝对不是一个好主意。

    您应该能够通过期望特定的输出来测试这些方法的作用。

    例如:

    • 检查范围变量是否已设置为预期值。
    • 确保已使用正确的输入调用了提供的依赖项(间谍)。

    【讨论】:

      【解决方案2】:

      这总是视情况而定,但是是的,公开私有类方法通常是个好主意。

      私有方法可以使用 _ 前缀约定命名,以将它们与公共方法区分开来,并且可以选择使用 Object.defineProperty 使其不可枚举。

      JavaScript 不能反映私有成员(局部变量)。除了作为基本 OOP 原则之一和总体上“一件好事”之外,封装会损害 JS 中的可测试性,并且几乎没有任何回报。

      封装不会为 JS 应用程序增加安全性,将单元视为黑盒也无济于事。另一方面,对每个被调用的方法设置间谍会有所帮助。

      【讨论】:

      • 我个人感谢一位陌生人,他不遗余力地以零 cmets 对整个问题投反对票。我们非常感谢您提出宝贵的反馈意见。
      猜你喜欢
      • 1970-01-01
      • 2013-06-02
      • 1970-01-01
      • 1970-01-01
      • 2020-06-30
      • 2019-10-26
      • 2012-10-06
      • 1970-01-01
      • 2022-01-04
      相关资源
      最近更新 更多