- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我是测试新手,我不确定我的做法是否正确:
我不想对特定类进行单元测试,而是对从我的 ioc 容器中解析出来的任何类进行单元测试。在 ioc 容器中,我将接口(interface)绑定(bind)到具体类,如下所示:
示例(我使用的是 Laravel 5):
// in a service provider
public function register(){
$this->app->bind('FooInterface', function() {
return new SomeConcreteFoo;
});
}
然后我想针对 FooInterface
而不是 SomeConcreteFoo
编写单元测试,后者稍后可以与其他类交换。
我想这样做的原因是,在我看来,相关测试应该针对我的 ioc 容器返回的任何内容,因为这就是我将在应用程序中使用的内容。在我看来,测试应该在接口(interface)级别完成,因为这是我定义应用程序其余部分对我的类的期望的地方。
我很难找到有关如何执行此操作的任何信息,这表明我可能以错误的方式思考这个问题。例如,也许我想要完成的更像是集成测试而不是单元测试。
所以第一个问题是:我是否正在考虑以正确的方式进行测试?如果我不是 - 您对替代测试路径的最佳实践有什么建议吗?
第二个问题:如果我的想法是正确的——我该如何设置 phpspec 来使用 Laravel IOC 容器,这样我就可以针对 IOC 返回的任何内容进行测试。
最佳答案
I want to not to do a unit test on a specific class but on whatever class get resolved out of my ioc container. In the ioc container I bind my interfaces to concrete classes, like so [...]
这不是编写单元测试的方式。单元测试是关于孤立地描述一个类的行为,因此实际创建的唯一真实对象是被测类(有时是简单的值对象)。
Then I want to write unit test against FooInterface and not SomeConcreteFoo which could be swapped out with some other class at a later point.
这确实是您应该编写单元测试的方式。更喜欢协作者的界面。
每个模拟框架都支持此功能,并且会为您创建测试替身,而不会强制您提供特定的实现。
class BarSpec extends ObjectBehavior
{
function it_does_amazing_things(FooInterface $foo)
{
$results = ['a', 'b', 'c'];
$foo->find('something')->willReturn($results);
$this->findMeSometing()->shouldReturn($results);
}
}
在此特定示例中,PhpSpec 将使用 Prophecy(其模拟框架)创建 FooInterface
的测试替身并将其注入(inject)示例方法。您对该对象的处理决定了它是伪造的、 stub 的还是模拟的。
The reason I want to do this is that it seems to me that the relevant testing should target whatever my ioc container returns, since that is what I'll be using in the application.
如上所述,单元测试侧重于单个类的行为。它的合作者通常是伪造的。这是出于几个原因。其中之一是速度。另一个是反馈。如果测试失败,我们将得到关于哪个类被破坏的明确反馈。如果您正在创建所有协作者,而不是使用测试替身,那么一个错误可能会使您的整个测试套件变红。我什至不会提到维护和创建所有需要的对象会有多困难(尽管容器在这里可以提供帮助)。
请记住,编写单元测试更像是一种设计事件,而不是测试事件。
For instance maybe what I'm trying to accomplish is more like an integration test rather than a unit test.
的确如此。阅读有关测试金字塔的更多信息。大多数测试应该是单元测试。然后,您应该进行一定数量的集成和验收测试,这些测试将同时执行多个类(class)。您需要比集成测试更多的单元测试的原因是后者更脆弱并且更难维护/更改它们。
使用 PHPUnit 进行集成测试。 PhpSpec 不是这项工作的正确工具。 PhpSpec 非常适合设计您的类(编写单元测试),尤其是当您先进行测试时。
The second question: In case my thinking is sound - how do I setup phpspec to make use of the Laravel IOC container, so that I can test against whatever the IOC returns..
你不知道。不过,您可以考虑在集成测试中使用容器。
一些阅读:
关于phpspec 单元测试 - 使用 ioc/service registry 来交付要测试的具体类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28266118/
我的 Dojo 应用程序包含几个小部件,它们都在 dijit.registry(dijit.WidgetSet 的一个实例)中自动注册。我想利用 filter() ( Link ) 或 map() (
yarn 添加 v1.3.2 [1/4] 解析包... 错误 发生意外错误:“https://registry.yarnpkg.com/react:getaddrinfo EAI_AGAIN regi
我知道 Docker Hub,而且我知道您可以在其上创建自己的存储库。 但是,当您想创建多个私有(private) repo 时,您必须付费。 所以我想要我自己的使用自签名证书的 Docker Reg
在 boostrapper package.xml 中,我试图从注册表中读取 MSSQL 条目,例如: 运行结果 setup.exe 后,我在日志中得到: “正在读取注册表项 'HKLM
每当我尝试将容器从本地计算机推送到 Google Container Registry 时,都会收到以下错误: denied: Unable to access the repository; ple
我的示例问题是 Vaclav .我已经按照 GCR 快速入门开始了这封信,其中需要创建一个新项目(称为 gcr-project)并复制 Flask(python)应用程序的代码。 构建docker镜像
不确定 SO是提出以下问题的正确论坛。如果不是,请将它们移到正确的位置。 我想设置一个 Docker Private Registry, 但是在阅读了 Docker 的文档(和 related SO
目前,我们的 CI/CD 环境是基于 Kubernetes 的云。 由于性能优势,Kubernetes 云提供商最近删除了 docker 守护程序。例如,Google Kubernetes Engin
我在 output1 和 output2 中得到了不同的结果。第一个给了我在注册表中实际看到的值,而后者只给了我默认值。我想念什么? String output1 = Registry.GetValu
我正在为 Inno Setup 中的程序编写安装程序。我的程序使用网页和 Internet Explorer 与之交互。 我的一些查询需要超过 10 秒,我注意到在我 friend 的计算机上,他有一
我正在为 docker 编写一个 API 客户端,而注册表 API 很难使用。我正在尝试从注册表中删除图像,但是我不断收到此错误 [ { code: 'UNSUPPORTED', message: '
我目前正在尝试通过 Java 应用程序查询和设置一些 Windows 注册表项。我们被授权使用 JNI-Registry 库(出于许可原因)。要设置的键和值不在我的控制之下(我正在修改由另一个第 3
首先,我想将此问题仅限于 Web 开发。因此,只要该语言用于 Web 开发,这就是语言不可知的。就个人而言,我是从 PHP 背景而来的。 通常我们需要使用来自多个作用域的对象。例如,我们可能需要在正常
Google Container Registry documentation解释说为了将图像拉入和推送到 gcr.io,您必须添加前缀 docker push和 pull带有 gcloud prev
我在使用 npm 安装 Cordova 时遇到问题。 从这里找到的答案,诀窍是运行 npm set registry https://registry.npmjs.org/这个命令究竟做了什么,为什么
我们有一个用于 Python 包的 Google Artifact Registry。鉴权工程like this .在本地运行良好。 但是,当我想要构建需要从我们的私有(private)注册表安装包的
我使用 GCR 来存储我团队的私有(private) docker 注册表。我有一个 docker 图像,我想公开显示,以便多个项目可以使用它/与客户共享/等等。 如何在 Google 的 Conta
我有 表 和 标签 具有多对多关系,以及连接表 post_tags。如果帖子有一个特定的标签名称,我想从帖子中返回所有标签。 这个想法是按特定标签过滤所有帖子。 我是这样做的: const posts
Registry 类和Naming 类有什么区别。 在我的应用程序中,我使用了 Registry 类。但我想了解 Naming 类及其用途? 最佳答案 区别在于Naming是一个带有静态方法的工具类,
我在公司网络上工作。 尝试安装 npm. 但我一次又一次地收到此错误。 $ npm install npm ERR! Windows_NT 6.1.7601 npm ERR! argv "C:\\Pr
我是一名优秀的程序员,十分优秀!