有没有办法模拟一个类并使用常规的类构造?

Posted

技术标签:

【中文标题】有没有办法模拟一个类并使用常规的类构造?【英文标题】:Is there a way to mock a class and use regular class construction? 【发布时间】:2015-01-13 08:22:05 【问题描述】:

背景:我仍在学习使用模拟并尝试测试 WordPress 插件。我宁愿不加载 WordPress,而只是在需要的地方使用模拟来伪造类/函数,并且只测试我的代码的输入和输出。

我正在尝试执行以下操作:

// WP_Query IS NOT DEFINED

$mock = \Mockery::mock('WP_Query', array('have_posts' => true));

$this->assertTrue($mock->have_posts());

$q = new WP_Query();

// fails with "Call to undefined method WP_Query::have_posts()"
$this->assertTrue($q->have_posts());

Mockery 可以实现上述目标吗?

【问题讨论】:

【参考方案1】:

当将数组作为第二个参数传递给 Mockery::mock 时,它需要构造函数参数,而不是要模拟的方法。

相反,您需要:

$mock = \Mockery::mock('WP_Query');
$mock->shouldReceive('have_posts')->andReturn(true);

【讨论】:

不幸的是,这会产生与上述相同的结果。 在您的示例中,您正在测试模拟上的断言,然后在下面您正在测试 WP_Query 的直接实例。如果 $q 确实是该类的实例,则该方法根本不存在。 我猜我认为 Mockery 实际上会为我构建它。因此,如果我正在测试将使用 WP_Query 的第二个对象“B”,我可以在“B”使用它之前模拟 WP_Query 的定义。 你已经模拟了它,但你没有使用模拟,你使用的是它的常规实例。 所以不可能按照我的意图使用常规实例

以上是关于有没有办法模拟一个类并使用常规的类构造?的主要内容,如果未能解决你的问题,请参考以下文章

使用 RhinoMocks,如何在没有空构造函数的情况下模拟或存根具体类?

C++ 静态工厂构造函数

如何使用构造函数?

有没有办法覆盖 LINQtoSQL 生成的类中的空构造函数?

无法使用 Rhino Mocks 模拟具有数组参数的构造函数的类

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