嘲弄:如何将 shouldReceive 与 method_exists 一起使用?

Posted

技术标签:

【中文标题】嘲弄:如何将 shouldReceive 与 method_exists 一起使用?【英文标题】:Mockery: how to use shouldReceive with method_exists? 【发布时间】:2016-02-24 16:25:55 【问题描述】:

在我的应用程序代码中,我有一个 method_exists 检查以授权在创建过程中进行一些挂钩:

// Note: $myClass is implementing a ListItemFactory interface.

if ($isCreate) 
  $methodName = "create$attrListItem";

  if (method_exists($myClass, $methodName)) 
    $item = $myClass->$methodName();
   else 
    [...]
  

我正在尝试测试这段代码,模拟$myClass 并检查$methodName 是否确实被调用。以下是我编写测试的方式:

/** @test */
function specific_create_method_is_called()

  $factory = Mockery::mock(ListItemFactory::class)->makePartial();
  $factory->shouldReceive("createCommentsListItem")->once();
  [...]

但这不起作用,因为method_exists 没有在模拟中定义。我对模拟东西还很陌生,所以也许有一种明显的方法来管理这个问题,比如“存根”想要的功能,但我找不到方法......

提前感谢您的帮助。

【问题讨论】:

ListItemFactory 的源代码很值得一看。 只是解决了非常相似的问题,看看***.com/questions/37927273/…这可能对你有帮助 这对我有帮助:***.com/a/46922330/470749 【参考方案1】:

创建一个小型测试类并对其进行部分模拟。 在测试类的范围内定义:

class MyClass implements ListItemFactory 
  public function createCommentsListItem()   

然后,在你的测试函数中:

/** @test */
function specific_create_method_is_called() 

  $myClass = m::mock(MyClass::class)->makePartial();

  $myClass->shouldReceive('createCommentsListItem')->once();

  // method_exists($myClass, 'createCommentsListItem')
  //   returns true now

(在本例中:use Mockery as m;

【讨论】:

以上是关于嘲弄:如何将 shouldReceive 与 method_exists 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

用嘲弄来测试 Laravel 外观总是通过,即使它应该失败

嘲弄“应该接收”但方法不存在

嘲弄“with”方法没有显示失败的原因

嘲弄和method_exists

如何Str::shouldReceive? (嘲笑 Illuminate\Support\Str)

如何在另一个被另一个调用的函数上使用 shouldReceive?