PHP Mockery:如何对一种方法或另一种方法设置期望?

Posted

技术标签:

【中文标题】PHP Mockery:如何对一种方法或另一种方法设置期望?【英文标题】:PHP Mockery: how to set expectation on a method OR another method? 【发布时间】:2015-11-21 19:24:45 【问题描述】:

我正在尝试使用Mockery 和phpUnit 来测试在执行某些代码时是否会调用给定类的一个方法或另一个方法。

这正是我想要做的(我正在使用 Laravel 5):

// Test an email is sent to new user
// upon account creation.
public function testEmailSentOnNewUserCreation()

    // Mail can be sent right on ...
    Mail::shouldReceive('send')->once(); //...OR...
    // ... it can be queued for later.
    Mail::shouldReceive('queue')->once();
    // I'm ignoring parameters and returning values here
    // for sake of brevity.

    $u = new User;
    $u->name = 'Jon Doe';
    $u->email = 'jon@doe.com';
    $u->save();

所以,我的问题是关于如何实现 OR 部分,如果可能的话。 我还搜索了一些可能有用的 PHPUnit 注释,但我找不到任何东西。

【问题讨论】:

单元测试的范例之一是您应该控制流程。您应该测试分别调用发送和队列的情况。我想它取决于另一个对象或依赖项。嘲笑那个。 @gontrollez 同意 - 单元测试应该一次测试一个结果/行为。 嗨@gontrollez!您能否将您的评论重新发布为答案,以便我将其标记为解决方案? 【参考方案1】:

单元测试的范例之一是您应该控制您实施的每个测试用例的确切流程。这就是为什么在您的测试中不应出现ifswitch 等。

当被测对象的行为依赖于另一个对象或给定条件(在逻辑上或多或少相同)时,必须模拟依赖关系以控制您正在测试的案例。

因此,在您的情况下,您应该模拟使您的类调用 sendqueue 方法的依赖项。

我认为这就是为什么测试框架没有实现你打算使用的东西。

【讨论】:

以上是关于PHP Mockery:如何对一种方法或另一种方法设置期望?的主要内容,如果未能解决你的问题,请参考以下文章

在 Typescript/React 中使用一种或另一种接口类型

使用TypeScript中的subscribe方法处理值

同时使用 AVAudioRecorder 和 AVAudioPlayer (或另一种收听和播放声音的方式)

如何取消 Parse 获取数据请求

php面试题与答案

php面试题与答案