如何在Typescript中对私有方法进行单元测试

问题描述 投票:5回答:3

当我尝试对类中的私有方法进行单元测试时获取错误,因为私有方法只能在类中访问。在这里,我为我的班级和摩卡测试添加了示例片段。请为我提供实施私有方法单元测试的解决方案。

班级名称:Notification.ts

class Notification {
 constructor() {}
 public validateTempalte() {
  return true;
 }

 private replacePlaceholder() {
  return true;
 }
}

单元测试:

import {Notification} from 'Notification';
import * as chai from "chai";

describe("Notification", function(){

  describe('#validateTempalte - Validate template', function() {
      it('it should return success', function() {
        const result = new Notification()
        chai.expect(result.validateTempalte()).to.be.equal(true);
      });
    });
  describe('#replacePlaceholder - Replace Placeholder', function() {
      it('it should return success', function() {
        const result = new Notification()
        // As expected getting error "Private is only accessible within class"
        chai.expect(result.replacePlaceholder()).to.be.equal(true);
      });
    });
});

作为一种解决方法,目前,我正在将函数replacePlaceholder的访问说明符更改为public。但我不认为这是一种有效的方法。

unit-testing typescript mocha
3个回答
4
投票

从技术上讲,在当前版本的TypeScript中,私有方法只是编译时被检查为私有 - 所以你可以调用它们。

class Example {
    public publicMethod() {
        return 'public';
    }

    private privateMethod() {
        return 'private';
    }
}

const example = new Example();

console.log(example.publicMethod()); // 'public'
console.log(example.privateMethod()); // 'private'

我之所以提到这一点,只是因为你问过怎么做,那就是你能做到的。

Correct Answer

但是,必须通过其他方法调用该私有方法...否则根本不调用。如果您测试其他方法的行为,则将在使用它的上下文中介绍私有方法。

如果您专门测试私有方法,您的测试将与实现细节紧密耦合(即,如果您重构实现,则不需要更改良好的测试)。

Disclaimer

如果您仍然在私有方法级别进行测试,则编译器可能在将来更改并使测试失败(即,如果编译器使方法“正确”为私有,或者未来版本的ECMAScript添加了可见性关键字等)。


4
投票

省略Typescript检查的一种可能的解决方案是动态访问属性(不知道它的好处)。

myClass['privateProp']或方法:myClass['privateMethod']()


-2
投票

由于私有方法在类外无法访问,因此您可以使用另一个公共方法在Notification类中调用replacePlaceholder(),然后测试公共方法。

© www.soinside.com 2019 - 2024. All rights reserved.