我有一个运行 5.6 版的 Laravel 项目。连接的数据库是带有 jenssegers/mongodb 包的 mongodb。
我编写了一个单元测试来测试与用户相关的功能。
该测试在配置的测试 mongodb 数据库中创建新用户。我想在每次测试运行后刷新数据库,所以我使用了RefreshDatabaseTrait。
使用RefreshDatabaseTrait 时,我在运行测试时收到以下错误:
有 1 个错误:
1) Tests\Unit\UserTest::it_gets_top_user 错误:在 null 上调用成员函数 beginTransaction()
当不使用 Trait 时,测试会在数据库中创建所有必要的内容并执行断言而不会出错。
测试看起来像这样:
/** @test */
public function it_gets_top_user()
{
factory(\App\Users\User::class, 5)->create();
$userOne = factory(\App\Users\User::class)->create([
'growth' => 10
]);
$topUser = Users::getTopUser();
$collection = new Collection();
$collection->push($userOne);
$this->assertEquals($collection, $topUser);
}
Run Code Online (Sandbox Code Playgroud)
我在我的 composer.json 中使用以下版本:
"laravel/framework": "5.6.*",
"jenssegers/mongodb": "3.4.*",
"phpunit/phpunit": "~7.0",
Run Code Online (Sandbox Code Playgroud)
服务器上使用了以下版本:
我使用安装在供应商目录中的 phpunit 调用测试:
vendor/phpunit/phpunit/phpunit
Run Code Online (Sandbox Code Playgroud) 当我在控制台中使用 PhpUnit 运行单元测试时,所有异常都会立即显示在那里。然而,当我转向功能测试时,我看不到发生的异常。
首先,我尝试了 symfony,WebTestCase就像这里所说的那样。所以我$client用所需的参数打电话,我得到了回应。但是我花了一些时间才明白这种行为就像我手动打开要测试的页面一样。来自$client->request包含文本 (html)的响应。是的,那里显示了错误,但有很多 html,而且很难找到异常。是的,我可以使用,$crawler->filter('.text-exception')->first()->text()但我希望异常在单元测试中可见。当我测试命令时,PhpUnit 和正常情况一样显示异常。
我试图将代码复制web/app_dev.php到测试用例。但它是一样的。我只有 html 响应。
那么如何才能让 PhpUnit 在功能测试中像单元测试一样显示异常呢?
我已经在服务提供者中注册了一个单例(它在它的构造函数中使用了一个 Guzzle 客户端):
public function register()
{
$this->app->singleton(Channel::class, function ($app) {
return new ChannelClient(new Client([
'http_errors'=> false,
'timeout' => 10,
'connect_timeout' => 10
]));
});
}
Run Code Online (Sandbox Code Playgroud)
我有一个验证方法:
public static function validateChannel($attribute, $value, $parameters, \Illuminate\Validation\Validator $validator)
{
$dataloader = app()->make(\App\Client\Channel::class);
if($dataloader->search($value)){
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
在 PHPUnit 测试中,如何app()->make(\App\Client\Channel::class);用模拟Client类替换 ,但仍然在测试中测试验证功能?
我对此代码进行了测试
Event::fake();
Queue::fake();
// Fake an order
$order = factory(Order::class)->make();
event(new PaymentWasCompleted($order));
Event::assertDispatched(PaymentWasCompleted::class, function ($e) use ($order) {
return $e->order->id === $order->id;
});
Queue::assertPushed(GenerateInvoiceJob::class, function ($job) use ($order) {
return $job->order->id === $order->id;
});
Run Code Online (Sandbox Code Playgroud)
我的 EventServiceProvider 看起来像这样:
protected $listen = [
\App\Events\PaymentWasCompleted::class => [
\App\Listeners\GenerateInvoice::class,
]
];
Run Code Online (Sandbox Code Playgroud)
GenerateInvoice 侦听器如下所示:
public function __construct()
{
$this->eventName = 'GenerateInvoice';
}
public function handle(PaymentWasCompleted $event)
{
// Access the order using $event->order
$order = $event->order;
$job = (new GenerateInvoiceJob($order, $this))->onQueue(app('QueueHelper')->getQueueName($this->eventName));
$this->dispatch($job);
}
Run Code Online (Sandbox Code Playgroud)
我希望测试通过,但它失败了:
未推送预期的 …
我可以使用--filter选项从套件中运行单个测试。
我想知道是否有一种方法可以在套件下动态运行多个测试?
谢谢
当我尝试在项目中运行我的全局 PHPUnit时遇到了一个令人费解的错误。
我的系统范围的PHPUnit 是 7.2.6 版,我的PHP 版本是 7.2.7。
这是我得到的错误:
PHPUnit 7.2.6 by Sebastian Bergmann and contributors.
PHP Fatal error: Uncaught Error: Call to undefined method PHPUnit\Util\Configuration::hasValidationErrors() in /Users/ronald/Sites/painting/vendor/phpunit/phpunit/src/TextUI/TestRunner.php:337
Stack trace:
#0 /Users/ronald/.composer/vendor/phpunit/phpunit/src/TextUI/Command.php(198): PHPUnit\TextUI\TestRunner->doRun(Object(PHPUnit\Framework\TestSuite), Array, true)
#1 /Users/ronald/.composer/vendor/phpunit/phpunit/src/TextUI/Command.php(151): PHPUnit\TextUI\Command->run(Array, true)
#2 /Users/ronald/.composer/vendor/phpunit/phpunit/phpunit(53): PHPUnit\TextUI\Command::main()
#3 {main}
thrown in /Users/ronald/Sites/painting/vendor/phpunit/phpunit/src/TextUI/TestRunner.php on line 337
Fatal error: Uncaught Error: Call to undefined method PHPUnit\Util\Configuration::hasValidationErrors() in /Users/ronald/Sites/painting/vendor/phpunit/phpunit/src/TextUI/TestRunner.php on line 337
Error: Call to undefined method PHPUnit\Util\Configuration::hasValidationErrors() in /Users/ronald/Sites/painting/vendor/phpunit/phpunit/src/TextUI/TestRunner.php on line 337 …Run Code Online (Sandbox Code Playgroud) 当预期为 200 时,我不断获得状态 500。这些是文件:
示例测试.php
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;
class ExampleTest extends TestCase
{
/**
* A basic test example.
*
* @return void
*/
public function testBasicTest()
{
$response = $this->get('/');
$response->assertStatus(200);
}
}
Run Code Online (Sandbox Code Playgroud)
phpunit.xml
<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
backupStaticAttributes="false"
bootstrap="vendor/autoload.php"
colors="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="false"
stopOnFailure="false">
<testsuites>
<testsuite name="Unit">
<directory suffix="Test.php">./tests/Unit</directory>
</testsuite>
<testsuite name="Feature">
<directory suffix="Test.php">./tests/Feature</directory>
</testsuite>
</testsuites>
<filter>
<whitelist processUncoveredFilesFromWhitelist="true">
<directory suffix=".php">./app</directory>
</whitelist>
</filter>
<php>
<env name="APP_ENV" value="testing"/>
<env name="BCRYPT_ROUNDS" value="4"/>
<env name="CACHE_DRIVER" value="array"/> …Run Code Online (Sandbox Code Playgroud) 问题是单元测试仅限于由“apache”用户运行,我从命令行运行它们的方式是:
sudo -u apache phpunit tests/EmailFunctionsLargeTest.php --stop-on-failure
它有效,但是如何sudo -u apache phpunit在使用 PhpStorm 时模拟?
聚苯乙烯
PhpStorm 以流浪用户身份运行测试...
我使用的是 Laravel v5.6.26、PHPUnit 6.5.8 和 PHP 7.2.9。
这是我的完整测试课程:
class ExampleTest extends TestCase
{
use RefreshDatabase;
/** @test */
public function basicTest()
{
$this->assertTrue(true);
$this->assertFalse(false);
}
}
Run Code Online (Sandbox Code Playgroud)
我phpunit从宅基地打电话。
没有use RefreshDatabase这需要513几毫秒。用use RefreshDatabase它需要17.29 几秒钟。我目前有 72 张桌子。
我只想测试一个与一张表相关联的模型。似乎刷新空的 72 个表需要花费很多时间。我试图删除除我需要的表之外的所有表,但use RefreshDatabase总是会重新迁移所有其他表。
我怎样才能加快速度?
我不认为硬件是这里的问题。那是我的电脑:Ram 32 GB,Intel® Core™ i7-7700K CPU @ 4.20GHz × 8,GeForce GTX 1070/PCIe/SSE2,我运行的是 Ubuntu 18.04.1 LTS 64 位。
我正在做一个测试,但是当它尝试检查用户是否登录时失败了:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Auth;
use App\User;
class RegisterTest extends TestCase
{
use RefreshDatabase;
/*.....
more test about registering
....*/
/** @test */
function redirect_to_home_page_and_logged_in_after_login()
{
$user = factory(User::class)->create([
'name' => 'Test',
'email' => 'test@hotmail.com',
'password' => '123456'
]);
$response = $this->post('login', [
'email' => 'test@hotmail.com',
'password' => '123456'
]);
//this works
$response->assertRedirect('/');
//this fails
$this->assertTrue(Auth::check());
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的控制器 HomeController:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class HomeController extends Controller
{
public function index() …Run Code Online (Sandbox Code Playgroud)