单元测试私人课程

时间:2011-03-05 11:57:35

标签: 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
    };
})();

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

1 个答案:

答案 0 :(得分: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)
}

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