我正在使用 selenium RC 和 PHPunit,但遇到了这个问题。我正在尝试执行assertEqual,但这就是结果:
Failed asserting that two strings are equal.
--- Expected
+++ Actual
@@ @@
abc
def
Run Code Online (Sandbox Code Playgroud)
步线:
$this->assertEquals("abc\ndef", $this->getValue("text"));
Run Code Online (Sandbox Code Playgroud)
“文本”是“abc\ndef”。
在火狐浏览器中工作正常。问题仅出在 IE 上。结果他没有告诉我什么不相等。
我遇到的问题是,我对某些断言和模拟的单元测试内存不足。内存每秒增加 100MB,然后在达到最大可用内存时终止 phpunit 进程。
我希望测试失败并显示一些有用的消息,但因为它只是终止进程,所以我真的不知道如何调试它。
知道为什么或如何调试这种行为吗?
我的 phpunit 测试:
<?php
class TestTest extends PHPUnit_Framework_TestCase
{
/*
* @expectedExceptionMessage success
*/
public function testExceptionMessage() {
throw new Exception('success');
}
}
Run Code Online (Sandbox Code Playgroud)
单元测试失败。这是 phpunit 的输出:
There was 1 error:
1) TestTest::testExceptionMessage
Exception: success
/path/to/TestTest.php:8
FAILURES!
Tests: 1, Assertions: 0, Errors: 1.
Run Code Online (Sandbox Code Playgroud)
在我看来,测试应该成功,因为异常消息是成功的,这正是 @expectedExceptionMessage 所期望的?
当我运行包含覆盖范围的 PHPUnit 套件时,我在生成的 HTML 中得到以下内容:
Legend
Low: 0% to 50% Medium: 50% to 90% High: 90% to 100%
Generated by PHP_CodeCoverage 2.0.13 using PHP 5.5.9-1ubuntu4.5 and PHPUnit 4.4.0 at Sun Dec 21 20:21:31 UTC 2014.
Run Code Online (Sandbox Code Playgroud)
50% 和 90%“切换点”是否可配置(这样我可以分别更改为 35% 和 75%)?如何?
我正在尝试运行一个单元测试,在测试运行之前将数据输入到数据库中。我已经定义了一个设置方法,它为我不想要的每个测试用例运行。setup 方法可以正常执行,没有问题。我想要的是将数据输入数据库一次,然后由所有测试用例使用。所以我设置了一个静态函数 setUpBeforeClass。
public static function setUpBeforeClass() : void {
parent::setUpBeforeClass();
static::$journalOption = new JournalOption;
$this->user = factory(User::class)->create();
}
Run Code Online (Sandbox Code Playgroud)
当调用用户工厂类时,我收到以下错误:
InvalidArgumentException:无法找到名称为 [默认] [App\User] 的工厂
UserFactory.php 文件存在于 database/factories/UserFactory.php
<?php
use Illuminate\Support\Str;
use Faker\Generator as Faker;
$factory->define(App\User::class, function (Faker $faker) {
return [
'name' => $faker->name,
'email' => $faker->unique()->safeEmail,
'email_verified_at' => now(),
'password' => '$2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm', // secret
'remember_token' => Str::random(10),
];
});
Run Code Online (Sandbox Code Playgroud) 我不知道如何设置ClockMock班级使用的日期/时间。在文档中:
此外,该函数
date()是模拟的,因此如果未指定时间戳,它将使用模拟的时间。其他带有可选时间戳参数默认为的函数time()仍将使用系统时间而不是模拟时间。
这就是我试图做的:
class Foo
{
public function now(): string {
return date('Y-m-d');
}
}
/**
* @covers Foo
* @group time-sensitive
*/
class FooTest extends TestCase
{
/**
* @covers Foo::now
*/
public function testNow(): void {
ClockMock::register(Foo::class);
ClockMock::withClockMock('2019-01-01');
$f = new Foo();
static::assertSame('2019-01-01', $f->now());
}
}
Run Code Online (Sandbox Code Playgroud)
断言仍然失败,实际日期是今天的日期。
我什至尝试date('Y-m-d')在测试类中的断言内部调用,但它仍然返回今天的日期而不是模拟日期。
如何设置模拟日期?
我对这个测试有问题:
$this->json('POST', 'api/login')
->assertStatus(422)
->assertJson([
'email' => ['The email field is required.'],
'password' => ['The password field is required.'],
]);
Run Code Online (Sandbox Code Playgroud)
我不明白错误是什么:
Unable to find JSON:
[{
"email": [
"The email field is required."
],
"password": [
"The password field is required."
]
}]
within response JSON:
[{
"message": "The given data was invalid.",
"errors": {
"email": [
"The email field is required."
],
"password": [
"The password field is required."
]
}
}].
Failed asserting that an array has the …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个简单的单元测试,如果我尝试在我的 Laravel Nova 中使用无效用户登录,但在运行测试时我不断收到此错误:
会话缺少预期的键 [错误]。
断言 false 为真失败。
我的测试:
public function an_invalid_user_can_not_login()
{
$user = factory(User::class)->create();
$response = $this->post('/nova/login', [
'email' => $user->email,
'password' => 'invalid',
'_token' => csrf_token(),
]);
$response->assertSessionHasErrors();
$this->assertGuest();
}
Run Code Online (Sandbox Code Playgroud)
我在这里做错了什么?
它在这一行失败:
$response->assertSessionHasErrors();
Run Code Online (Sandbox Code Playgroud) 我在 IntelliJ(2019.3.2,Build #IU-193.6015.39)中加载了一个 PHP symfony 项目,其结构如下(省略了不相关的文件,如 README 等):
<project_root>
+- src/
+- tests/
+- vendor/
| +- autoload.php
+- .env
+- composer.json
+- composer.lock
+- docker-compose.yml
+- Dockerfile
+- phpunit.xml
+- phpunit-custom.xml
Run Code Online (Sandbox Code Playgroud)
项目解释器通过 docker-compose 设置为使用远程 docker(Docker for Mac),并且 IntelliJ 正确检测解释器和调试器:

docker-compose.yml 具有以下结构:
version: "2"
services:
app:
build: .
env_file:
- ./.env
ports:
- 8888:80
volumes:
- ./:/var/www/
- .docker/app-dev/nginx/fastcgi-timeouts.conf:/etc/nginx/fastcgi-timeouts.conf
- .docker/app-dev/php/conf.d/00_opcache.ini:/etc/php/conf.d/00_opcache.ini
- .docker/app-dev/php/conf.d/30_xdebug.ini:/etc/php/conf.d/30_xdebug.ini
- .docker/app-dev/php/php-fpm-settings.conf:/etc/php/php-fpm-settings.conf
db:
image: mysql:5.6
environment:
MYSQL_DATABASE: project_database
MYSQL_USER: user
MYSQL_PASSWORD: password
MYSQL_ROOT_PASSWORD: master_password
ports:
- 3306:3306 …Run Code Online (Sandbox Code Playgroud) 因此,在任何人关闭此功能之前,我将在这里参考答案并提出问题。
所以我的问题是我想要对 laravel 进行强密码验证,包括 10 个字符、数字、大写小写等等。
我找到了:https : //stackoverflow.com/a/31549892/1270259
问题是,这个正则表达式看起来不对:
/^.*(?=.{3,})(?=.*[a-zA-Z])(?=.*[0-9])(?=.*[\d\X])(?=.*[!$#%]).*$/
Run Code Online (Sandbox Code Playgroud)
由于我不擅长正则表达式,我想我会问如何修复它以使其验证:
我觉得他们的答案很接近。当这是针对 github 操作运行时,返回的错误是preg_match(): Compilation failed: escape sequence is invalid in character class at offset 46.
我也有任何想法如何让 Laravel 7 工作以匹配上述约束?
phpunit ×10
laravel ×4
php ×4
symfony ×2
docker ×1
laravel-5 ×1
laravel-7 ×1
laravel-nova ×1
memory ×1
mocking ×1
regex ×1
selenium-rc ×1
unit-testing ×1