【问题标题】:How do i properly test Laravel events?我如何正确测试 Laravel 事件?
【发布时间】:2015-05-22 14:21:19
【问题描述】:

我正在为一个模型编写测试,该模型会在其属性之一发生更改时触发一个事件。不幸的是,我想不出测试这个的最佳方法。型号代码为:

class Foo extends Eloquent {
   public function setNameAttribute($value) {
        $this->attributes['name'] = $value;
        if($this->exists && ($this->original['name'] != $value)) {
            Event::fire('foo.NameChange', array($this));
        }
    }
}

我对事件触发的初步测试:

$bar = Foo::first();
Event::shouldReceive('fire')->once()->with('foo.NameChange', array($bar));
$bar->name = 'test';

问题是,上述测试仍然通过,如果:

  • 根本没有发生任何事件
  • 我第二次更改模型的名称(应该会触发 第二次活动,对吧?)

只有在发生一个foo.NameChange 事件时,我才能使我的测试通过?所有其他 senario 都应该通过我的测试。

【问题讨论】:

  • 如果根本没有发生event,你的测试应该会失败——因为你已经嘲笑它并说它应该被解雇once
  • 你打电话给Mockery::close()了吗?也可以看看我在old SO question上的解释
  • 非常感谢@BramGerritsen!用Mockery::close() 语句关闭测试确实解决了它!您能否将您的评论转换为答案?我也想知道为什么Laravel的官方文档中没有提到这一点。
  • 我自己不使用 Laravel,但我认为手册中肯定应该提到它。也许您可以通知框架作者。当您必须处理官方教程中的无效示例代码时,学习框架时没有什么比这更令人沮丧了。
  • @nstapelbroek 请注意,您没有必须在每个测试中调用Mockery::close()如果您为整个套件设置它(参见 Bram 引用的手册)。

标签: php laravel laravel-4 phpunit mockery


【解决方案1】:

您必须在您的 tearDown() 方法中调用 Mockery::close()。 请参阅有关 PHPUnit 集成的 Mockery docs

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-03
    • 2021-08-12
    • 2020-10-21
    • 2021-09-17
    • 2010-09-07
    • 2018-07-15
    • 1970-01-01
    • 2017-12-04
    相关资源
    最近更新 更多