我正在使用 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)
上面的代码只是一个示例,但显示了我的代码的结构。运行时,它会跳过消费者测试,就像生产者失败一样。我期望对于提供者中的每组测试数据,生产者将使用该数据运行,并且其所有消费者也相应地运行。
我有一个类想要在稍后的测试中进行模拟:
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 :-?
我想测试一个类的方法,该方法实例化另一个对象并调用该对象的方法。
如何在 不依赖注入的情况下模拟这个对象Foo2及其方法?run()
这是可能的还是我需要修改 Foo 类的代码来注入对象?
class Foo {
public function bar()
{
$foo2 = new Foo2();
$data = $foo2->run();
}
}
Run Code Online (Sandbox Code Playgroud) public function dashboard()
{
return $this->render('dashboard.html.twig');
}
Run Code Online (Sandbox Code Playgroud)
我想知道如何正确编写此方法的单元测试。我使用 PHPUnit 编写单元测试。
如何为 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')]); 正在创建与我的密码控制器不同的密码。
任何想法,这里出了什么问题?
我用 Laravel 准备了一个示例 API。它总是返回这个对象:
{
"a": 1,
"b": 2
}
Run Code Online (Sandbox Code Playgroud)
现在,我想更好地了解如何使用phpunit. 我发现有assertJson和assertJsonFragment方法,但我无法理解它们之间的区别。
假设我想断言响应的确切结构,因此它需要是a=1和b=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 上测试。
目前我已经开始学习 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 文件中的一些代码吗?
我有一个单元测试,我试图测试NumberFormatter.
我的代码的简化版本是:
\n\npublic 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}\nRun Code Online (Sandbox Code Playgroud)\n\n这会导致失败:
\n\nFailed asserting that two strings are equal.\n--- Expected\n+++ Actual\n@@ @@\n-\'16,66 \xe2\x82\xac\'\n+\'16,66 \xe2\x82\xac\'\nRun Code Online (Sandbox Code Playgroud)\n\n我假设这与欧元符号(可能是字符编码)或字符串中的某种隐藏字节有关,但不太确定如何检查这一点?
\n\n谁能给我一些关于如何调试这个问题的建议,或者可能的原因是什么?
\n\n干杯,
\n\n莫
\n正如标题所说,我正在用 Symfony 5 构建一个 API。我有一些控制器需要不同的用户权限,我想测试,所以我决定创建两个具有不同角色的用户进行测试 -ROLE_USER和ROLE_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) 我正在尝试在 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 …