2011-03-05 214 views
6

比方说,我在JavaScript中使用了以下模块 - 一种模式:单元测试私有类

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

它是可取的,如果是的话 - 我怎么可以公开美孚的单元测试?有没有一些常见的技术或模式来做到这一点?

回答

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吗?))