使用mockery进行接口模拟?

3

我想在测试中创建一些接口的模拟(mockery-mock)。

但是,模拟(mocking)的结果是一个不是接口实例的mock对象。例如,生成的mock类没有实现"MyInterface"。

经过适当的检查,我发现Mockery可以并且会定位和加载我的接口(通过在mockery类中添加一些"echo"语句)。

真的是这样吗?Mockery不会声明模拟的类实现了请求的接口吗?这难道不完全绕过了TDD的良好实践吗?

$mock = m::mock('My\\Cool\\Interface');
//now $mock is not aninstanceof My\Cool\Interface

希望能收到您的回复。


你能在模拟语句之前检查 interface_exists('My\Cool\Interface') 的结果吗? - undefined
2个回答

3

我曾经认为模拟接口不起作用,但最终我发现了一个打字错误导致模拟无法正常工作。

目前,模拟接口对我来说是有效的。

这里是一个例子。

示例接口

interface Convertor
{

    /**
     * @return array
     */
    public function getIds();

}

在phpunit测试中创建模拟对象

    $convertor = Mockery::mock('Convertor');
    $convertor->shouldReceive('getIds')->andReturn([10, 20]);

您可以发一下您的代码吗?


我认为这是在讨论当您拥有以下情况时: `class A implements I {}function tested(A $a) { if ($a instanceof I) { // do something } }` 您无法使用Mockery创建模拟对象来测试此函数。 - undefined

1
回答我的问题:是的,嘲笑在实现接口的模拟对象方面没有很好的工作表现。
对我来说,这使得嘲笑在有效的测试驱动开发方面几乎无用。 :-(

接口模拟确实有效。请看一下@4ekistik对类似问题的回答:https://dev59.com/p3jZa4cB1Zd3GeqPay6S#39545249 - undefined
只是模拟界面吗? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接