Как повторно использовать функции PHPUnit

75
4

Я хочу повторно использовать некоторые из своих функций PHPUnit, вызывая их вместо повторения их во всех модульных тестах, например, например:

public function testContent()
{
$this->assertNotEmpty($this->response, $this->message);
}

Если я поместил его под тесты /TestCase.php, он будет работать для всех модульных тестов.

Где было бы подходящее место для этого или как это обычно делается? Кстати, я использую его на Laravel 4.

спросил(а) 2021-01-19T18:05:56+03:00 2 месяца, 3 недели назад
1
Решение
99

По-видимому, ваша проблема заключается не в повторном использовании тестов, а в том, что ваши тесты вызываются, когда этого не ожидается.

Итак, имейте в виду: любой метод с именем, начинающимся с "test" (testFoo, testBar) в существующем классе, будет рассматриваться как тест.

Итак, если у вас есть классы A, B и C, как это

class A extends \PHPUnit_Framework_TestCase {
public function testFoo() {...}
public function testBar() {...}
}

class B extends A {
public function testBaz() {...}
}

class C extends A {
public function testQuz() {...}
}

у вас будет 8 тестов: A :: testFoo(), A :: testBar(), B :: testFoo(), B :: testBar(), B :: testBaz(), C :: testFoo(), C:: testBar(), C :: testQuz().

Вероятно, это не то, что вы пытались сделать. Вы можете иметь testFoo и testBar только в классах B и C, а не в A. В этом случае вам просто нужно объявить A как абстрактный класс.

abstract class A extends \PHPUnit_Framework_TestCase {
public function testFoo() {...}
public function testBar() {...}
}

class B extends A {
public function testBaz() {...}
}

class C extends A {
public function testQuz() {...}
}

Теперь у вас есть 6 тестов: B :: testFoo(), B :: testBar(), B :: testBaz(), C :: testFoo(), C :: testBar(), C :: testQuz().

Может быть, это то, что вам нужно, может быть, нет. Возможно, вы хотите иметь testFoo() и testBar() только в некоторых унаследованных классах, а не во всех из них.

В этом случае сделайте утверждения в родительском классе вместо тестов.

abstract class A extends \PHPUnit_Framework_TestCase {
public function assertFoo() { ... }
public function assertBar() { ... }
}

class B extends A {
public function testFoo() { $this->assertFoo(); ...}

public function testBaz() {...}
}

class C extends A {
public function testBar() { $this->assertBar(); ...}

public function testQuz() {...}
}

Теперь у вас всего 4 теста: B :: testFoo(), B :: testBaz, C :: testBar(), C :: testQuz()

ответил(а) 2021-01-19T18:05:56+03:00 2 месяца, 3 недели назад
44

Сделайте свое собственное утверждение в соответствии с этим руководством

Сделайте что-то вроде


namespace Vendor\Library\Tests;

abstract class BaseTestCase extends \PHPUnit_Framework_TestCase
{
public function assertContentNotEmpty($response) {
$this->assertNotEmpty($response);
}
}

А затем распространите этот класс на свои тесты. Если по некоторым причинам этот подход не подходит, вы можете сделать утверждение как отдельный класс.

ответил(а) 2021-01-19T18:05:56+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема