1

在对 Laravel 项目进行单元测试时,不会注册宏,也不会触发应用程序事件。例如,需要以下文件app/start/globals.php

// app/helpers/nav.php

var_dump("nav.php loaded");

App::before(function($request) {
    var_dump("app::before called");

    HTML::macro('nav_link', function(..) { .. });
});

HTML::macro('nav_link', function(..) { .. });

只会打印第一个 var_dump。似乎App::before没有调用该事件。此外,即使在事件之外,HTML::macro调用也不会被注册(BadMethodCallException尝试使用时会抛出 a)。这些在正常使用中工作正常。

测试用例相当简单:

<?php

class ExampleTest extends TestCase {

    public function testBasicExample() {
        $crawler = $this->client->request('GET', '/');
        $this->assertTrue($this->client->getResponse()->isOk());
    }
}
4

1 回答 1

3

我找到了添加助手的正确方案:

  1. 最初我将它们作为 PHP 函数使用——这意味着它们所在的文件必须是require_once. 由于可以为每个测试重新加载应用程序(无需清除内部包含文件缓存),因此这些文件未包含在后续测试中。一个。将所有适当的函数转换为HTML::macro.
  2. App::before事件实际上绑定为路由器上的前置过滤器 - 默认情况下不调用它(删除App::before或调用Route::enableFilters()每个测试)。
  3. 包含仅包含来自 app/start/globals.php 的宏的文件,使用require,而不是require_once. 这些需要注册每个应用程序负载(每个测试)。
于 2013-09-13T14:42:28.497 回答