标签: phpunit

Laravel 5.6 单元测试在 null 上调用成员函数 beginTransaction()

我有一个运行 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)

服务器上使用了以下版本:

  • PHP 7.2
  • MongoDB 3.4
  • PHP MongoDB 扩展 1.4.2

我使用安装在供应商目录中的 phpunit 调用测试:

vendor/phpunit/phpunit/phpunit
Run Code Online (Sandbox Code Playgroud)

php phpunit mongodb laravel laravel-5.6

3
推荐指数
1
解决办法
2067
查看次数

如何使用phpunit在功能测试中使symfony显示异常

当我在控制台中使用 PhpUnit 运行单元测试时,所有异常都会立即显示在那里。然而,当我转向功能测试时,我看不到发生的异常。

首先,我尝试了 symfony,WebTestCase就像这里所说的那样。所以我$client用所需的参数打电话,我得到了回应。但是我花了一些时间才明白这种行为就像我手动打开要测试的页面一样。来自$client->request包含文本 (html)的响应。是的,那里显示了错误,但有很多 html,而且很难找到异常。是的,我可以使用,$crawler->filter('.text-exception')->first()->text()但我希望异常在单元测试中可见。当我测试命令时,PhpUnit 和正常情况一样显示异常。

我试图将代码复制web/app_dev.php到测试用例。但它是一样的。我只有 html 响应。

那么如何才能让 PhpUnit 在功能测试中像单元测试一样显示异常呢?

phpunit symfony

3
推荐指数
1
解决办法
987
查看次数

在 Laravel 中的验证方法中使用单例进行单元测试

我已经在服务提供者中注册了一个单例(它在它的构造函数中使用了一个 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类替换 ,但仍然在测试中测试验证功能?

validation phpunit laravel

3
推荐指数
1
解决办法
1881
查看次数

Laravel 事件模拟

我对此代码进行了测试

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)

我希望测试通过,但它失败了:

未推送预期的 …

php phpunit laravel laravel-5

3
推荐指数
1
解决办法
2922
查看次数

如何在 PHPUnit 中过滤多个测试?

我可以使用--filter选项从套件中运行单个测试。

我想知道是否有一种方法可以在套件下动态运行多个测试?

谢谢

php phpunit

3
推荐指数
2
解决办法
1898
查看次数

PHPUnit 未定义的方法调用

当我尝试在项目中运行我的全局 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)

php phpunit

3
推荐指数
1
解决办法
1373
查看次数

PHPUNIT 测试 - 预期状态 200 但收到 500

当预期为 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)

phpunit laravel

3
推荐指数
1
解决办法
7546
查看次数

如何使用不同的 Linux 用户运行 PHPUnit

  1. 我的单元测试位于 Vagrant 机器内
  2. 我在 Ubuntu 18 上使用 Xdebug 和 Apache,
  3. 我使用 PhpStorm 来运行 PHPUnit 测试。

问题是单元测试仅限于由“apache”用户运行,我从命令行运行它们的方式是:

sudo -u apache phpunit tests/EmailFunctionsLargeTest.php --stop-on-failure

它有效,但是如何sudo -u apache phpunit在使用 PhpStorm 时模拟?

聚苯乙烯

PhpStorm 以流浪用户身份运行测试...

php linux phpunit xdebug phpstorm

3
推荐指数
1
解决办法
466
查看次数

RefreshDatabase 非常慢

我使用的是 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 位。

phpunit laravel-5

3
推荐指数
1
解决办法
1690
查看次数

测试用户是否登录 laravel 5.7

我正在做一个测试,但是当它尝试检查用户是否登录时失败了:

<?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)

php phpunit laravel

3
推荐指数
2
解决办法
4648
查看次数