Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 测试不友好代码_Unit Testing_Testing - Fatal编程技术网

Unit testing 测试不友好代码

Unit testing 测试不友好代码,unit-testing,testing,Unit Testing,Testing,假设我有以下代码,无法修改: A类{ 公共剂量测定法(){ //大量的业务逻辑 数据=获取数据(); //许多其他依赖于数据的业务逻辑 } 私有获取数据(){ //连接到数据库 //发送web请求 //向月球发送载人任务 //处理获得的数据 返回数据; } } 测试此类代码的最佳实践是什么?我想确保doSomething()做了它应该做的事情,但我想为它提供已知的数据,而不是在obtainData()中运行代码你看过模拟吗?它可能由您的单元测试框架提供。了解一下如何帮助您进行棕地测试。C#中的

假设我有以下代码,无法修改:

A类{
公共剂量测定法(){
//大量的业务逻辑
数据=获取数据();
//许多其他依赖于数据的业务逻辑
}
私有获取数据(){
//连接到数据库
//发送web请求
//向月球发送载人任务
//处理获得的数据
返回数据;
}
}

测试此类代码的最佳实践是什么?我想确保
doSomething()
做了它应该做的事情,但我想为它提供已知的数据,而不是在
obtainData()中运行代码

你看过模拟吗?它可能由您的单元测试框架提供。

了解一下如何帮助您进行棕地测试。C#中的Moles允许您为私有代码和其他人的代码提供自己的实现

当你有一套很好的测试来覆盖这一混乱局面时,请拯救人类

如果意大利面密码的始作俑者在附近,请帮我揍他一顿,你为什么不呢

要获得最佳实践,请阅读Bob叔叔的干净代码


总而言之:如果测试中的代码有外部依赖项,请将它们显式地设置为外部可配置的。

您没有发布有问题的代码,通常罪魁祸首是构造函数中的新对象创建、静态调用、常量的使用以及其他一些

其思想是将类与其依赖项解耦。实现这一点的常用方法是依赖项注入

也可以考虑使用较小的类来完成非常特定的任务,如果你在句子中用“and”描述你的类任务,那么它的任务就太多了,也就更难测试了。 有关测试静态依赖项和硬编码依赖项的信息,请参阅及其所有相关链接。

进行设计

  • 确定本课程的职责
  • 接下来,提取此类的依赖项。将所有不与bullet#1对齐的方法移动到依赖项中
  • e、 g.如果此类不负责处理数据库或网络IO,则将其提取为此类的依赖项。将它们作为ctor参数或方法参数注入(如果只有一个公共方法需要)

    现在,不需要删除或子类化、重写或增加测试的成员可见性

    您的单元测试将创建一个实例作为

    _testSubject = new A(new Mock<DataRepository>.object, new Mock<WebService>.object, new Mock<SpaceStation>.object);
    
    \u testSubject=newa(new Mock.object,new Mock.object,new Mock.object);
    

    而您的生产代码将使用上述角色的实际实现。

    我知道模拟。但是我如何创建一个模拟来测试这个类呢?我应该模拟什么?部分模拟在所有测试FW中都不可用。在phpunit中没有私有的而不是受保护的。。。哎哟-(@Denis:private怎么了?@zerkms:如果它受到保护,他可以声明一个扩展a的类B并重新定义AcquinData()。根据他使用的语言,他可能无法使用private方法实现这一点。private没问题,许多变量最好设置为不可触及。我支持private。只要有依赖注入。“棕色的"听起来不错!不过我想问的是一般的最佳实践。像这样的东西如何通过常规的单元测试进行测试。@rdineiu:最初的问题没有包括特定的语言或技术。我提供了一个通用的答案。@GregC,没关系。通用是我想要的。所以答案是,如果可能,撕掉私有方法并用其他方法替换它,或者,如果不可能,不要测试。对吗?@rdineiu:(我还以为你站在我这边)测试,测试,再测试。如果不可能测试,你的工具就很弱。@GregC,(不是我投了反对票…)如果工具很弱(因为该语言不支持这种深奥的魔法),让你自己在空间/时间或语言的工作方式上挖一个洞,然后提取该死的方法?我正在考虑,我正在考虑通过最新的PHP5.3提供的黑色巫术(我的代码恰好是PHP)来访问私有方法,但这是正确的处理方法吗?不知何故,它看起来……非常丑陋……如果一种语言没有提供公开私有方法所需的魔力,你会怎么做?或者你就是不想这样做?我自己也曾就这个主题发表过几篇文章。你永远不应该测试你的私有方法和变量。有例外,但即使是那些也反映了一个糟糕的设计。你应该测试公共方法,这些方法将验证私有方法是否按预期工作。你将1.节省时间,2.获得更有意义的代码覆盖率报告3.更多地享受单元测试方式。正如我所说,在一个类上测试太多的东西意味着需要使用disti将其拆分为更小的类nct的职责,使得这个类更容易模仿和减少预期结果,从而减少测试。你不必说服我,我是依赖注入和解耦的粉丝。但不幸的是,我们并不是生活在一个完美的世界中,有时我们需要继承坏代码(当我说坏的时候,我是外交的).但它仍然需要测试…想法是将不友好的部分/尴尬的依赖性转移到角色后面,你可以在测试中模拟/替换这些角色。
    _testSubject = new A(new Mock<DataRepository>.object, new Mock<WebService>.object, new Mock<SpaceStation>.object);