Mockery - 在构造函数中创建一个模拟

Posted

技术标签:

【中文标题】Mockery - 在构造函数中创建一个模拟【英文标题】:Mockery - creating a mock in the constructor 【发布时间】:2013-07-10 19:19:10 【问题描述】:

有没有办法在测试类构造函数/类 setUp 函数中创建一个 mock,以便所有测试方法都可以使用这个 mock?

我尝试在构造函数中创建:

public class testMocks extends phpUnit_Framework_TestCase 

    protected $mock;

    public function __construct()
    
        $this->mock = Mockery::mock('myMockedClass');
    

...

但这不起作用。如果第一个测试通过,那么所有在模拟上断言的测试都会通过,即使它们应该失败(即运行应该失败的 shouldReceive)。有什么想法吗?

【问题讨论】:

【参考方案1】:

你必须使用 setUp 功能,像这样:

public function setUp()    

    $this->mock = Mockery::mock('myMockedClass');

【讨论】:

你真的试过这个吗?它对我不起作用。与使用构造函数相同。 当然。查看 PHPUnit phpunit.de/manual/3.7/en/fixtures.html 的文档【参考方案2】:

您不应该覆盖PHPUnit_Framework_TestCase 的构造函数,请参阅我在#15051271 和#17504870 上的回答

您还需要在tearDown 方法上调用Mockery::close()。 close 方法为您的下一个测试清理 mockery 容器并运行您设置的期望。

public function tearDown()

    Mockery::close();

【讨论】:

好吧,我尝试过使用 setUp 并使用构造函数,但要确保我调用了父构造函数。都不适合我。 查看我编辑的帖子,我认为这可能是您的问题的原因。 很遗憾没有。我正在像您的示例一样使用 tearDown :( 尝试自己测试。在您的设置中创建一个类的模拟并运行两个测试都断言模拟应该接收方法调用。进行第一次通过并编写第二个测试,以便模拟上的断言应该失败(即期望该方法被调用10次但只调用一次)。对我来说,两个测试都通过了。如果第一个测试通过,下一个测试通过。我原以为这是很常见的事情想做的事。 我做了一百万次这样的事情,所以应该可以。您可以在 gist 中发布您的 testCase 的完整代码吗? 经过进一步的实验,我发现如果我先调用 parent::setUp(),setUp 就可以工作。不幸的是,phpunit 文档中没有说明这一点。

以上是关于Mockery - 在构造函数中创建一个模拟的主要内容,如果未能解决你的问题,请参考以下文章

Mockery 和 Laravel 构造函数注入

在构造函数中创建的外部向量

Flutter:如何在我的 Style 类中创建构造函数? [复制]

如何在 Python 中创建多个构造函数? [复制]

在 Loopback 4 中创建一个模拟请求对象

如何在 Spring Boot 中创建一个调用包含构造函数注入的服务的测试?