标签: phpunit

PHPUnit 提供程序无法使用依赖项

我正在使用 PHPUnit 3.4.9,但我在@depends注释方面遇到了一些问题。它的工作原理与示例中类似,但当生产者依赖提供者时就会中断。我不知道这是否意味着有效,但我的代码基本上采用以下形式:

<?php
    class StackTest extends PHPUnit_Framework_TestCase
    {
      /**
       * @dataProvider provider
       */
      public function testEmpty ($data)
      {
        $stack = array();
        $this->assertTrue(empty($stack));

        return $stack;
      }

      /**
       * @depends testEmpty
       */
      public function testPush (array $stack)
      {
        array_push($stack, 'foo');
        $this->assertEquals('foo', $stack[count($stack)-1]);
        $this->assertFalse(empty($stack));

        return $stack;
      }

      /**
       * @depends testPush
       */
      public function testPop (array $stack)
      {
        $this->assertEquals('foo', array_pop($stack));
        $this->assertTrue(empty($stack));
      }

      public function provider ()
      {
        return array(
           // Some testing data here...
        );
      }
    }
Run Code Online (Sandbox Code Playgroud)

上面的代码只是一个示例,但显示了我的代码的结构。运行时,它会跳过消费者测试,就像生产者失败一样。我期望对于提供者中的每组测试数据,生产者将使用该数据运行,并且其所有消费者也相应地运行。

php phpunit

6
推荐指数
1
解决办法
3328
查看次数

在某些情况下如何告诉mock调用原始方法?

我有一个类想要在稍后的测试中进行模拟:

class Original {
  function calculate($a) { ... }
}
Run Code Online (Sandbox Code Playgroud)

测试中:

$mock = $this->getMock('Original',['calculate']);
$mock->expcets($this->any())
     ->will($this->returnValueMap([ 
      [1,'ABC'],
      [2,'BCD']
      // somehow tell $mock to call the original calculate() here
);
Run Code Online (Sandbox Code Playgroud)

我想告诉在某些条件$mock下回退到原始版本calculate(),例如,如果参数与任何提供的检查不匹配。据我从阅读 PhpUnit 代码中了解到,如果未找到匹配项,调用程序将返回 null :-?

php phpunit mocking stub

6
推荐指数
2
解决办法
9610
查看次数

无需依赖注入的方法的模拟对象

我想测试一个类的方法,该方法实例化另一个对象并调用该对象的方法。

如何在 不依赖注入的情况下模拟这个对象Foo2及其方法?run()

这是可能的还是我需要修改 Foo 类的代码来注入对象?

class Foo {

    public function bar()
    {
        $foo2 = new Foo2();
        $data = $foo2->run();
    }
}
Run Code Online (Sandbox Code Playgroud)

php phpunit unit-testing

6
推荐指数
1
解决办法
2951
查看次数

如何编写单元测试来在 symfony 3 中渲染树枝模板

public function dashboard()
{
    return $this->render('dashboard.html.twig');
}
Run Code Online (Sandbox Code Playgroud)

我想知道如何正确编写此方法的单元测试。我使用 PHPUnit 编写单元测试。

phpunit symfony twig

6
推荐指数
1
解决办法
2454
查看次数

如何编写 Laravel 更新密码表单的测试?

如何为 Laravel 更新密码表单编写 phpunit 测试?

这是我的测试:

$user = \factory(\App\User::class)->create(['password' => \Hash::make('password')]);
        $this->actingAs($user);  

        $response = $this->call('PUT', '/user/update-password', array(
            '_token' => csrf_token(),
            'current_password' => 'password',
            'new_password' => 'newone',
            'repeat_new_password' => 'newone',
        ));
        $response->assertStatus(302);        

        $this->assertDatabaseHas('users', ['name' => $user->name, 'password' => \Hash::make('newone')]);
Run Code Online (Sandbox Code Playgroud)

密码控制器正在保存新密码,如下所示:

....
$user->password = \Hash::make($request->new_password);
$user->save();
....
Run Code Online (Sandbox Code Playgroud)

我收到错误:“无法断言表 [user] 中的行与属性匹配”

更新密码表单工作正常,因为我可以使用更新的密码登录。我猜想: $this->assertDatabaseHas('users', ['name' => $user->name, 'password' => \Hash::make('newone')]); 正在创建与我的密码控制器不同的密码。

任何想法,这里出了什么问题?

phpunit laravel laravel-5

6
推荐指数
2
解决办法
3730
查看次数

使用 Laravel 测试 JSON 响应

我用 Laravel 准备了一个示例 API。它总是返回这个对象:

{
    "a": 1,
    "b": 2
}
Run Code Online (Sandbox Code Playgroud)

现在,我想更好地了解如何使用phpunit. 我发现有assertJsonassertJsonFragment方法,但我无法理解它们之间的区别。

假设我想断言响应的确切结构,因此它需要是a=1b=2,仅此而已。起初,我确信这会起作用:

$response = $this->get('/api/foo');

$response->assertStatus(200)
         ->assertJson(['a' => 1, 'b' => 2]);
Run Code Online (Sandbox Code Playgroud)

它将通过测试,但问题是,如果我向响应添加更多属性(例如c=3或其他属性),它仍然会通过测试。然后有一种assertJsonFragment方法,对于我的测试,其行为相同,只是给出不同的错误消息。

assertJson越野车吗?有没有其他方法可以完成我想要做的事情,即确保响应是这组特定的属性?

在 Laravel 5.6 和 5.7 上测试。

php phpunit json laravel

6
推荐指数
1
解决办法
1万
查看次数

php artisan 命令在特定文件夹内创建测试文件

目前我已经开始学习 Laravel 5.6 中的单元测试。默认情况下,我的 laravel 项目有一个“tests”目录,其中还有 2 个目录,即“Features”和“Unit”。每个目录都包含一个“ExampleTest.php”

./tests/Features/ExampleTest.php
./tests/Unit/ExampleTest.php
Run Code Online (Sandbox Code Playgroud)

每当我使用命令创建新的测试文件时

php artisan make:test BasicTest
Run Code Online (Sandbox Code Playgroud)

默认情况下,它总是在“Features”目录中创建测试文件,而我希望在“tests”目录下创建该文件。

是否有一个命令可以用来指定测试文件的创建路径。像这样的东西

php artisan make:test BasicTest --path="tests"
Run Code Online (Sandbox Code Playgroud)

我已经尝试过上面的路径命令,但它不是有效的命令。

我需要更改 phpunit.xml 文件中的一些代码吗?

phpunit laravel

6
推荐指数
2
解决办法
8844
查看次数

PHPUnit - 断言两个字符串相等失败

我有一个单元测试,我试图测试NumberFormatter.

\n\n

我的代码的简化版本是:

\n\n
public function testGetFormattedPrice()\n{\n    $formatter = NumberFormatter::create(\n        "de_DE",\n        NumbererFormatter::CURRENCY\n    );\n\n    $this->assertEquals(\n        \'16,66 \xe2\x82\xac\',\n        $formatter->formatCurrency(16.66, "EUR")\n    );\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这会导致失败:

\n\n
Failed asserting that two strings are equal.\n--- Expected\n+++ Actual\n@@ @@\n-\'16,66 \xe2\x82\xac\'\n+\'16,66 \xe2\x82\xac\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

我假设这与欧元符号(可能是字符编码)或字符串中的某种隐藏字节有关,但不太确定如何检查这一点?

\n\n

谁能给我一些关于如何调试这个问题的建议,或者可能的原因是什么?

\n\n

干杯,

\n\n

\n

php phpunit unit-testing

6
推荐指数
1
解决办法
9084
查看次数

Symfony 5 Api 测试 createClient() LogicalException

正如标题所说,我正在用 Symfony 5 构建一个 API。我有一些控制器需要不同的用户权限,我想测试,所以我决定创建两个具有不同角色的用户进行测试 -ROLE_USERROLE_ADMIN. 当前代码是这样的(注意,它不是完整代码,只是一个虚拟示例/起点)

测试用例.php

<?php

namespace App\Tests;

use App\Entity\User;
use App\Tests\Http\RequestBuilder;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

class ApiTestCase extends WebTestCase
{

    private static $userData = [
        'firstName' => 'Pera',
        'lastName'  => 'Peric',
        'email'     => 'test.user@test.com',
        'password'  => 'test123',
        'roles'     => [
            'ROLE_USER'
        ]
    ];

    private static $adminUserData = [
        'firstName' => 'Admin',
        'lastName'  => 'Adminovic',
        'email'     => 'admin.user@test.com',
        'password'  => 'admin123',
        'roles'     => [
            'ROLE_ADMIN'
        ]
    ];

    public static function createTestUser()
    {
        $res = RequestBuilder::create(self::createClient()) …
Run Code Online (Sandbox Code Playgroud)

php testing phpunit symfony symfony5

6
推荐指数
2
解决办法
4157
查看次数

Laravel phpunit 如何使用不同的迁移进行测试

我正在尝试在 Laravel 中设置测试,但我想运行与通常运行的迁移不同的迁移。

我运行的用于启动数据库的迁移从生产环境导入数据。
为了进行测试,我想使用一个名为“test”的不同数据库,并且我想用测试数据而不是生产数据填充此测试数据库。

我添加了一个config/database.php使用“测试”数据库的“测试”连接:

'connections' => [

        'mysql' => [
            'database' => env('DB_DATABASE', 'forge'),
            ...
        ],

        'testing' => [
            'database' => 'test',
            ...
        ],
],
Run Code Online (Sandbox Code Playgroud)

我设置phpunit.xml使用这个“测试”连接:

<?xml version="1.0" encoding="UTF-8"?>
<phpunit ...>
    ...
    <php>
        <env name="DB_CONNECTION" value="testing"/>
        ...
    </php>
</phpunit>
Run Code Online (Sandbox Code Playgroud)

现在我想使用测试数据初始化这个“测试”数据库,使用来自与默认文件夹不同的文件夹的迁移。

我可以像这样使用正常的迁移:

<?php

namespace Tests;

use Illuminate\Foundation\Testing\TestCase as BaseTestCase;
use Illuminate\Foundation\Testing\DatabaseMigrations;

abstract class TestCase extends BaseTestCase
{
    use DatabaseMigrations;

    public function setUp(): void
    {
        parent::setUp();
        $this->seed();
    }
}
Run Code Online (Sandbox Code Playgroud)

但这使用默认文件夹database/migrations。我想将测试迁移放在文件夹中tests/database/migrations

有没有办法让use …

php phpunit database-migration laravel

6
推荐指数
1
解决办法
6484
查看次数