单元测试私人课程

tyr*_*dis 6 javascript unit-testing

假设我在JavaScript中使用了以下模块类型模式:

var myModule = (function () {
    var Foo = function () { /* ... */ };
    var Bar = function () {
        this.foo = new Foo();
    };
    Bar.prototype.someMethod = function () {
        this.foo.someMethod();
    };
    return {
        'Bar': Bar
    };
})();
Run Code Online (Sandbox Code Playgroud)

是否可取,如果是 - 我怎样才能公开Foo进行单元测试?这样做有一些共同的技巧或模式吗?

Jos*_*ton 6

我认为你不应该真的需要对private成员进行单元测试.只要您对公共成员进行全面测试,私有成员中的任何错误都将表现为公共成员的错误.然后,您可以使用良好的调试来找出确切的问题.

或者,如果您在单独的构建中运行测试,则可以公开封闭对象,并对其进行测试.您需要记住在部署之前删除对封闭对象的引用 - 或者您可以以某种方式自动化它.老实说,除非你打包一个供公众消费的图书馆,否则我一般都不会去除它.

var myModule = (function () {
    var _this = this;
    var Foo = function () { /* ... */ };
    var Bar = function () {
        this.foo = new Foo();
    };
    Bar.prototype.someMethod = function () {
        this.foo.someMethod();
    };
    return {
        'Bar': Bar,
        '__private__': _this
    };
})();

function test_foo(obj) {
    var foo = obj.__private__.Foo;
    assert(foo.prop, 10)
}
Run Code Online (Sandbox Code Playgroud)

对于内部系统,如果能够清楚地理解不应该访问私有成员,那么能够访问私有数据/功能通常是没有问题的.通过提供带有名称的封闭对象的引用来突出显示__private__.(你能说我对Python有点了吗?;))