【问题标题】:Mockery - creating a mock in the constructorMockery - 在构造函数中创建一个模拟
【发布时间】: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)。有什么想法吗?

【问题讨论】:

    标签: unit-testing mocking phpunit mockery


    【解决方案1】:

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

    public function setUp()    
    {
        $this->mock = Mockery::mock('myMockedClass');
    }
    

    【讨论】:

    【解决方案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 文档中没有说明这一点。
    猜你喜欢
    • 2021-12-01
    • 2015-08-15
    • 2016-04-22
    • 2020-01-18
    • 1970-01-01
    • 2019-11-24
    • 2015-10-09
    • 1970-01-01
    • 2020-11-22
    相关资源
    最近更新 更多