有没有办法模拟一个类并使用常规的类构造?
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,如何在没有空构造函数的情况下模拟或存根具体类?
有没有办法覆盖 LINQtoSQL 生成的类中的空构造函数?