Laravel 在工作台中整洁的测试助手?

Posted

技术标签:

【中文标题】Laravel 在工作台中整洁的测试助手?【英文标题】:Laravels neat testing helpers in workbench? 【发布时间】:2014-03-05 05:13:51 【问题描述】:

查看laravel testing documentation,您会了解我喜欢在工作台中使用的所有很酷的助手。

很遗憾,我做不到。

Illuminate\Foundation\Testing\TestCase 从包目录运行我的测试时似乎不可用,因此我无法扩展它。

<?php namespace Acme\Foo;

    class TestCase extends \Illuminate\Foundation\Testing\TestCase 

    /**
     * Creates the application.
     *
     * @return \Symfony\Component\HttpKernel\HttpKernelInterface
     */
    public function createApplication()
    
        $unitTesting = true;

        $testEnvironment = 'testing';

        return require __DIR__.'/../../../../bootstrap/start.php';
    



PHP Fatal error:  Class 'Illuminate\Foundation\Testing\TestCase' not found in 
/Applications/MAMP/htdocs/Webseiten/acme/workbench/acme/foo/tests/TestCase.php on line 3

我认为这不是正确的方法,无论如何都应该这样做......

我已经找到了orchestral/testbench,但我不确定使用它是否是个好主意。它似乎需要整个 laravel 框架,这对我来说没有意义吗? (一个包应该扩展一个 laravel 安装而不是第二次添加框架!?)

【问题讨论】:

它添加了整个框架,因为如果你将包推送到 github 并在 travis-ci 上运行它,那么它就会丢失。 所以将 "laravel/framework": "4.1.*" 添加到包 composer.json "require-dev" 将是一个好习惯吗? 添加它是为了确保当你需要 2.0 时,它会加载 laravel 4.0,当你加载 2.1 时,它会加载 laravel 4.1 等等。它有什么不同吗?可能仅适用于仅在工作台上使用它的人,但在一个应用程序中再次加载两个作曲家供应商仍然是一个坏主意。在这个阶段,我并没有真正专注于支持导致 github.com/orchestral/testbench#working-with-workbench 和 github.com/orchestral/testbench/issues/29 等问题的工作台 好的,我明白了。所以如果我只是"require-dev" "laravel/framework": "4.1.*" 它可能不会工作。 testbench是否可以解决这些问题,但目前在 4.1 上表现不佳...有什么好的选择吗?使用 travis-ci 测试开发 laravel 包的最佳方法是什么——不要管工作台,做完全不同的事情? 我的建议是在了解包开发的早期阶段使用工作台。一旦你熟悉了它,就将它移出并作为一个独立的包继续工作,原因有很多。 【参考方案1】:

我就是这么干的,

首先,更改工作台目录中的phpunit.xml 内容。您将“引导”属性部分,将其从 vendor/autoload.php 更改为 ../../../bootstrap/autoload.php

然后尝试在您的工作台目录上运行phpunit

【讨论】:

或者,您可以在命令行上传递引导选项(如果您不想更改配置文件):phpunit --bootstrap=../../../bootstrap/autoload.php 这太好了,两个答案都对我有很大帮助,非常感谢!【参考方案2】:

对我来说,由于工作台的设置方式,测试用例只能从 PHPUnit_Framework_TestCase 扩展。所以我从 app 文件夹而不是包文件夹运行测试用例。

我选择第二个选项,因为 testbench 很大程度上取决于特定的 Laravel 版本,并且设置起来似乎有点繁重。我所做的是将主应用程序下的 phpunit.xml 配置为将包测试文件夹包含为测试套件:

<testsuite name="MyPack">
    <directory>./workbench/winponta/mypack/tests/</directory>
</testsuite>

然后运行:

$ phpunit --testsuite=MyPack

使用这种方法,我们仍然可以从 \Illuminate\Foundation\Testing\TestCase 扩展。

我在http://ngo-hung.com/blog/2014/04/16/laravel-unit-testing-in-workbench-note找到了这个解决方案

【讨论】:

是的,这是一个很好的解决方案。只有当您想要进行某种 CI 时才会出现问题。 (例如特拉维斯,我就是这种情况)谢谢你的回答:-) 好吧,我在这个 Laravel 项目中仍然没有使用 CI,所以不必考虑它。欢迎您。【参考方案3】:

删除

命名空间 Acme\Foo;

应该修复它。然后你可以从包目录运行测试。还要确保在包目录中运行 composer dump-autoload 或从主应用程序目录运行 php artisan dump-autoload

更新我能够在干净的 Laravel 4.1 安装中复制错误并按照以下步骤修复它,而无需安装额外的包:

1 - 在主 laravel 根目录 composer.json 中安装 PHPUnit(不是工作台包 composer.json 文件)

"require-dev": 
     "phpunit/phpunit": "3.7.*"
,

2 - 在主 laravel 根目录中运行 composer update

3 - 在您的测试类中使用完全限定名称(命名空间以 为前缀)

<?php
class SomeTest extends \Illuminate\Foundation\Testing\TestCase 
   public function createApplication()
   
       $unitTesting = true;
       $testEnvironment = 'testing';
       return require __DIR__.'/../../../../bootstrap/start.php';
   
   public function testSomething()
   
       $this->assertTrue(true);
   

4 - 要运行工作台包测试,请转到包目录并运行 main phpunit

# in workbench/package/vendor dir run
../../../vendor/bin/phpunit

5 - 输出绿色标志识别 laravel 应用第三方包

marcanuy@bolso-server:~/public_html/pkgtesting/workbench/my/pack$ ../../../vendor/bin/phpunit --debug
PHPUnit 3.7.31 by Sebastian Bergmann.

Configuration read from /home/marcanuy/public_html/pkgtesting/workbench/my/pack/phpunit.xml


Starting test 'SomeTest::testSomething'.
.

Time: 64 ms, Memory: 6.25Mb

OK (1 test, 1 assertion)

【讨论】:

你以前做过吗?对我来说,这不会改变任何东西:-/(+ 这是一个干净的 laravel 安装) 是的,最近我一直在努力解决类似的问题,试图在不引入新包的情况下测试一个包,我在这里工作正常:github.com/marcanuy/popularity/blob/master/tests/StatsTest.php 然后我从包目录运行我的测试,比如 ../ ../../vendor/bin/phpunit 这很奇怪,因为如果我像您在测试中所做的那样添加命名空间,我会收到与您收到的相同的错误,删除它后工作正常,您是否运行了 dump-autoloads? 是的,我确实从我的应用程序的根目录运行了php artisan dump-autoload。它甚至提到它考虑了我的工作台。我会看看你的存储库。也许这会有所帮助。无论如何,如果我不想使用 travis-ci,这将不起作用,对吧? 不确定,因为我还没有将 travis-ci 与 Laravel 包一起使用,但可能可以设置自定义脚本。

以上是关于Laravel 在工作台中整洁的测试助手?的主要内容,如果未能解决你的问题,请参考以下文章

Github CICD 测试在 laravel 中无法正常工作?

R 代码在整洁的文本中突然停止工作

通过控制器助手授权:方法 authorize() 不存在 - Laravel 5.5

想让你的Mac桌面清爽整洁?试试Mac临时文件存储小助手Yoink

Mail::fake Laravel 单元测试不工作,真正的控制器工作

laravel 4 无法让 phpunit 测试工作