【问题标题】:Testing Model with Observer in Laravel 7在 Laravel 7 中使用观察者测试模型
【发布时间】:2020-10-11 12:00:21
【问题描述】:

我正在尝试测试一个创建模型的控制器。

有一个观察者在模型上监听created 事件。观察者负责调度作业以创建依赖于基本模型/表的子模型(表条目)。

我知道I'm sure it will work 是测试时说的最糟糕的话。为了能够测试整个过程的功能,我添加了类似的东西;

if (env('APP_ENV') === 'testing') {
    TariffPricingComponentsCalculater::dispatchNow($tariff, $components);
}

我感觉这段代码不应该出现在 prod 版本中。有没有更简洁的方法可以在测试时立即分派工作

谢谢。

【问题讨论】:

  • 您可以通过创建模型并让观察者触发作业来让代码根据需要工作……您可以伪造队列,使其实际上不会调度,但您可以断言事情排队
  • 我明白了,这意味着我必须在不同的测试文件中测试作业,以确保它完成了我期望的工作。我说的对吗?
  • 有点取决于你在做什么以及它是如何设置的,但你确实有能力通过伪造很多服务来测试很多东西,显然你也是如何设计你的代码的影响独立测试的难易程度
  • 非常感谢。它现在正在使用两个单独的测试文件和一个伪造的队列:)

标签: laravel phpunit laravel-testing


【解决方案1】:

在测试时禁用观察者的更好方法是在 setup 方法中调用 Model::unsetEventDispatcher()

例如:这里我有 Plan 模型,它有一个名为 PlanObserver 的观察者,我可以在测试类的 setup 方法中禁用它们:

class PlanTest extends TestCase
{
    use RefreshDatabase;

    public function setUp():void
    {
        parent::setUp();
        
        Plan::unsetEventDispatcher();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-28
    • 1970-01-01
    • 2011-06-10
    • 1970-01-01
    相关资源
    最近更新 更多