2011-07-06 67 views
4

我刚刚阅读了关于Javascript的测试驱动开发的这本精彩的书,并且在那里他提到了创建具有私有成员的对象的一种惊人方式,最初由Douglas Crockford创建,称为“功能性遗产”。它是这样的:功能继承中的单元测试私有方法

this.funcInh = function() { 
     var privateString = "functional inheritance"; 

     function setPrivateString(string) { 
      privateString = string; 
     } 

     function getPrivateString() { 
      return privateString; 
     } 

     return { 
      setPrivateString: setPrivateString, 
      getPrivateString: getPrivateString 
     }; 
    }; 

虽然我真的很喜欢创建对象的这种方式,我想知道如何在地球上我可以测试它,不是测试特权功能“setPrivateString”的返回值,其他和“getPrivateString ”。这只是一个例子,但我真的不明白任何方式来测试“私人”功能或特权函数调用他们应该的功能...任何想法?

回答

2

你真的想测试私人吗?

我认为就您的公共方法如预期的那样工作并向“外部世界”提供正确的结果,您不应该关心“盒子内”的工作原理和工作方式。

查看更多关于这一点:Should I test private methods or only public ones?

+0

我部分同意你的看法。在某些情况下,函数可以给出看起来是正确的回报,而唯一可以确定的方法就是测试一个私有函数......然而,我认为这对功能继承是非常困难的... –

+1

从我自己的经验来看:没有测试私有者就容易多了 - 如果你的公共方法调用某些私有(它做了别的 - 例如创建文件/在DB/orr上执行任何操作) - 只是测试公共方法的结果并且像预期的那样,另外测试诸如文件,DB上的数据等外部事物的创建/修改/删除/没有“知道”私有和他们的实现 - 以这种方式,你总是可以完全改变内部事物,并且测试将在公共结果和所有“外部”资源/数据在结束时一直运行良好 – Laimoncijus

0

组织的私有成员和职能到另一个类,可你测试。或创建一个公共测试功能,即工作只是在测试环境中,否则抛出由菲利普·沃尔顿,在其博客上谷歌的工程师解释例外

0

Here is a really good workflow to test your private methods

原理

  • 编写代码通常
  • 绑定您的私有方法的对象在一个单独的代码阵营,由开始由_例如纪念其
  • 环绕代码阵营,并最终意见

然后使用一个构建任务或您自己的构建系统(例如grunt-strip-code)来剥离生产构建的这个区块。

您的测试版本可以访问您的私有api,而您的生产版本没有。

片段

编写代码,因为这:

var myModule = (function() { 

    function foo() { 
    // private function `foo` inside closure 
    return "foo" 
    } 

    var api = { 
    bar: function() { 
     // public function `bar` returned from closure 
     return "bar" 
    } 
    } 

    /* test-code */ 
    api._foo = foo 
    /* end-test-code */ 

    return api 
}()) 

而且你的咕噜任务一样,

grunt.registerTask("test", [ 
    "concat", 
    "jshint", 
    "jasmine" 
]) 
grunt.registerTask("deploy", [ 
    "concat", 
    "strip-code", 
    "jshint", 
    "uglify" 
]) 

更多更深

In a later article,它解释了 “为什么” 的“测试私人方法”