Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit17a3ccf

Browse files
committed
feature#30813 New PHPUnit assertions for the WebTestCase (Pierstoval, fabpot)
This PR was merged into the 4.3-dev branch.Discussion----------New PHPUnit assertions for the WebTestCase| Q | A| ------------- | ---| Branch? | master| Bug fix? | no| New feature? | yes| BC breaks? | no| Deprecations? | no| Tests pass? | yes| Fixed tickets | replaces#29990| License | MIT| Doc PR | n/aWhile reviewing#29990, and working on some tests, I realized that we could do better by adding PHPUnit constraint classes in various components that are then used in WebTextCase.**Before**```php<?phpnamespace App\Tests;use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;class DefaultControllerTest extends WebTestCase{ public function testSomething() { $client = static::createClient(); $crawler = $client->request('GET', '/test'); $this->assertSame(200, $client->getResponse()->getStatusCode()); $this->assertContains('Hello World', $crawler->filter('h1')->text()); }}```**After**```php<?phpnamespace App\Tests;use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;class DefaultControllerTest extends WebTestCase{ public function testSomething() { $client = static::createClient(); $client->request('GET', '/test'); $this->assertResponseIsSuccessful(); $this->assertSelectorTextContains('h1', 'Hello World'); }}```Commits-------4f91020 added PHPUnit assertions in various components2f8040e Create new PHPUnit assertions for the WebTestCase
2 parentsfefe62c +4f91020 commit17a3ccf

File tree

38 files changed

+2062
-8
lines changed

38 files changed

+2062
-8
lines changed

‎src/Symfony/Bundle/FrameworkBundle/CHANGELOG.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ CHANGELOG
44
4.3.0
55
-----
66

7+
* added`WebTestAssertions` trait (included by default in`WebTestCase`)
78
* renamed`Client` to`KernelBrowser`
89
* Not passing the project directory to the constructor of the`AssetsInstallCommand` is deprecated. This argument will
910
be mandatory in 5.0.

‎src/Symfony/Bundle/FrameworkBundle/Test/KernelTestCase.php‎

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
*/
2424
abstractclass KernelTestCaseextends TestCase
2525
{
26-
useKernelShutdownOnTearDownTrait;
26+
useTestCaseSetUpTearDownTrait;
2727

2828
protectedstatic$class;
2929

@@ -37,6 +37,11 @@ abstract class KernelTestCase extends TestCase
3737
*/
3838
protectedstatic$container;
3939

40+
protectedfunctiondoTearDown():void
41+
{
42+
static::ensureKernelShutdown();
43+
}
44+
4045
/**
4146
* @return string The Kernel class name
4247
*

‎src/Symfony/Bundle/FrameworkBundle/Test/KernelShutdownOnTearDownTrait.php‎renamed to ‎src/Symfony/Bundle/FrameworkBundle/Test/TestCaseSetUpTearDownTrait.php‎

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,31 +13,60 @@
1313

1414
usePHPUnit\Framework\TestCase;
1515

16-
// Auto-adapt to PHPUnit 8 that added a `void` return-type to the tearDownmethod
16+
// Auto-adapt to PHPUnit 8 that added a `void` return-type to thesetUp/tearDownmethods
1717

1818
if ((new \ReflectionMethod(TestCase::class,'tearDown'))->hasReturnType()) {
1919
/**
2020
* @internal
2121
*/
22-
traitKernelShutdownOnTearDownTrait
22+
traitTestCaseSetUpTearDownTrait
2323
{
24+
privatefunctiondoSetUp():void
25+
{
26+
}
27+
28+
privatefunctiondoTearDown():void
29+
{
30+
}
31+
32+
protectedfunctionsetUp():void
33+
{
34+
$this->doSetUp();
35+
}
36+
2437
protectedfunctiontearDown():void
2538
{
26-
static::ensureKernelShutdown();
39+
$this->doTearDown();
2740
}
2841
}
2942
}else {
3043
/**
3144
* @internal
3245
*/
33-
traitKernelShutdownOnTearDownTrait
46+
traitTestCaseSetUpTearDownTrait
3447
{
48+
privatefunctiondoSetUp():void
49+
{
50+
}
51+
52+
privatefunctiondoTearDown():void
53+
{
54+
}
55+
56+
/**
57+
* @return void
58+
*/
59+
protectedfunctionsetUp()
60+
{
61+
$this->doSetUp();
62+
}
63+
3564
/**
3665
* @return void
3766
*/
3867
protectedfunctiontearDown()
3968
{
40-
static::ensureKernelShutdown();
69+
$this->doTearDown();
4170
}
4271
}
4372
}
Lines changed: 224 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,224 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespaceSymfony\Bundle\FrameworkBundle\Test;
13+
14+
usePHPUnit\Framework\Constraint\LogicalAnd;
15+
usePHPUnit\Framework\Constraint\LogicalNot;
16+
useSymfony\Bundle\FrameworkBundle\KernelBrowser;
17+
useSymfony\Component\BrowserKit\Test\ConstraintasBrowserKitConstraint;
18+
useSymfony\Component\DomCrawler\Crawler;
19+
useSymfony\Component\DomCrawler\Test\ConstraintasDomCrawlerConstraint;
20+
useSymfony\Component\HttpFoundation\Request;
21+
useSymfony\Component\HttpFoundation\Response;
22+
useSymfony\Component\HttpFoundation\Test\ConstraintasResponseConstraint;
23+
24+
/**
25+
* Ideas borrowed from Laravel Dusk's assertions.
26+
*
27+
* @see https://laravel.com/docs/5.7/dusk#available-assertions
28+
*/
29+
trait WebTestAssertions
30+
{
31+
publicstaticfunctionassertResponseIsSuccessful(string$message =''):void
32+
{
33+
self::assertThat(static::getResponse(),newResponseConstraint\ResponseIsSuccessful(),$message);
34+
}
35+
36+
publicstaticfunctionassertResponseStatusCodeSame(int$expectedCode,string$message =''):void
37+
{
38+
self::assertThat(static::getResponse(),newResponseConstraint\ResponseStatusCodeSame($expectedCode),$message);
39+
}
40+
41+
publicstaticfunctionassertResponseRedirects(string$expectedLocation =null,int$expectedCode =null,string$message =''):void
42+
{
43+
$constraint =newResponseConstraint\ResponseIsRedirected();
44+
if ($expectedLocation) {
45+
$constraint = LogicalAnd::fromConstraints($constraint,newResponseConstraint\ResponseHeaderSame('Location',$expectedLocation));
46+
}
47+
if ($expectedCode) {
48+
$constraint = LogicalAnd::fromConstraints($constraint,newResponseConstraint\ResponseStatusCodeSame($expectedCode));
49+
}
50+
51+
self::assertThat(static::getResponse(),$constraint,$message);
52+
}
53+
54+
publicstaticfunctionassertResponseHasHeader(string$headerName,string$message =''):void
55+
{
56+
self::assertThat(static::getResponse(),newResponseConstraint\ResponseHasHeader($headerName),$message);
57+
}
58+
59+
publicstaticfunctionassertResponseNotHasHeader(string$headerName,string$message =''):void
60+
{
61+
self::assertThat(static::getResponse(),newLogicalNot(newResponseConstraint\ResponseHasHeader($headerName)),$message);
62+
}
63+
64+
publicstaticfunctionassertResponseHeaderSame(string$headerName,string$expectedValue,string$message =''):void
65+
{
66+
self::assertThat(static::getResponse(),newResponseConstraint\ResponseHeaderSame($headerName,$expectedValue),$message);
67+
}
68+
69+
publicstaticfunctionassertResponseHeaderNotSame(string$headerName,string$expectedValue,string$message =''):void
70+
{
71+
self::assertThat(static::getResponse(),newLogicalNot(newResponseConstraint\ResponseHeaderSame($headerName,$expectedValue)),$message);
72+
}
73+
74+
publicstaticfunctionassertResponseHasCookie(string$name,string$path ='/',string$domain =null,string$message =''):void
75+
{
76+
self::assertThat(static::getResponse(),newResponseConstraint\ResponseHasCookie($name,$path,$domain),$message);
77+
}
78+
79+
publicstaticfunctionassertResponseNotHasCookie(string$name,string$path ='/',string$domain =null,string$message =''):void
80+
{
81+
self::assertThat(static::getResponse(),newLogicalNot(newResponseConstraint\ResponseHasCookie($name,$path,$domain)),$message);
82+
}
83+
84+
publicstaticfunctionassertResponseCookieValueSame(string$name,string$expectedValue,string$path ='/',string$domain =null,string$message =''):void
85+
{
86+
self::assertThat(static::getResponse(), LogicalAnd::fromConstraints(
87+
newResponseConstraint\ResponseHasCookie($name,$path,$domain),
88+
newResponseConstraint\ResponseCookieValueSame($name,$expectedValue,$path,$domain)
89+
),$message);
90+
}
91+
92+
publicstaticfunctionassertBrowserHasCookie(string$name,string$path ='/',string$domain =null,string$message =''):void
93+
{
94+
self::assertThat(static::getClient(),newBrowserKitConstraint\BrowserHasCookie($name,$path,$domain),$message);
95+
}
96+
97+
publicstaticfunctionassertBrowserNotHasCookie(string$name,string$path ='/',string$domain =null,string$message =''):void
98+
{
99+
self::assertThat(static::getClient(),newLogicalNot(newBrowserKitConstraint\BrowserHasCookie($name,$path,$domain)),$message);
100+
}
101+
102+
publicstaticfunctionassertBrowserCookieValueSame(string$name,string$expectedValue,bool$raw =false,string$path ='/',string$domain =null,string$message =''):void
103+
{
104+
self::assertThat(static::getClient(), LogicalAnd::fromConstraints(
105+
newBrowserKitConstraint\BrowserHasCookie($name,$path,$domain),
106+
newBrowserKitConstraint\BrowserCookieValueSame($name,$expectedValue,$raw,$path,$domain)
107+
),$message);
108+
}
109+
110+
publicstaticfunctionassertSelectorExists(string$selector,string$message =''):void
111+
{
112+
self::assertThat(static::getCrawler(),newDomCrawlerConstraint\CrawlerSelectorExists($selector),$message);
113+
}
114+
115+
publicstaticfunctionassertSelectorNotExists(string$selector,string$message =''):void
116+
{
117+
self::assertThat(static::getCrawler(),newLogicalNot(newDomCrawlerConstraint\CrawlerSelectorExists($selector)),$message);
118+
}
119+
120+
publicstaticfunctionassertSelectorTextContains(string$selector,string$text,string$message =''):void
121+
{
122+
self::assertThat(static::getCrawler(), LogicalAnd::fromConstraints(
123+
newDomCrawlerConstraint\CrawlerSelectorExists($selector),
124+
newDomCrawlerConstraint\CrawlerSelectorTextContains($selector,$text)
125+
),$message);
126+
}
127+
128+
publicstaticfunctionassertSelectorTextSame(string$selector,string$text,string$message =''):void
129+
{
130+
self::assertThat(static::getCrawler(), LogicalAnd::fromConstraints(
131+
newDomCrawlerConstraint\CrawlerSelectorExists($selector),
132+
newDomCrawlerConstraint\CrawlerSelectorTextSame($selector,$text)
133+
),$message);
134+
}
135+
136+
publicstaticfunctionassertSelectorTextNotContains(string$selector,string$text,string$message =''):void
137+
{
138+
self::assertThat(static::getCrawler(), LogicalAnd::fromConstraints(
139+
newDomCrawlerConstraint\CrawlerSelectorExists($selector),
140+
newLogicalNot(newDomCrawlerConstraint\CrawlerSelectorTextContains($selector,$text))
141+
),$message);
142+
}
143+
144+
publicstaticfunctionassertPageTitleSame(string$expectedTitle,string$message =''):void
145+
{
146+
self::assertSelectorTextSame('title',$expectedTitle,$message);
147+
}
148+
149+
publicstaticfunctionassertPageTitleContains(string$expectedTitle,string$message =''):void
150+
{
151+
self::assertSelectorTextContains('title',$expectedTitle,$message);
152+
}
153+
154+
publicstaticfunctionassertInputValueSame(string$fieldName,string$expectedValue,string$message =''):void
155+
{
156+
self::assertThat(static::getCrawler(), LogicalAnd::fromConstraints(
157+
newDomCrawlerConstraint\CrawlerSelectorExists("input[name=\"$fieldName\"]"),
158+
newDomCrawlerConstraint\CrawlerSelectorAttributeValueSame("input[name=\"$fieldName\"]",'value',$expectedValue)
159+
),$message);
160+
}
161+
162+
publicstaticfunctionassertInputValueNotSame(string$fieldName,string$expectedValue,string$message =''):void
163+
{
164+
self::assertThat(static::getCrawler(), LogicalAnd::fromConstraints(
165+
newDomCrawlerConstraint\CrawlerSelectorExists("input[name=\"$fieldName\"]"),
166+
newLogicalNot(newDomCrawlerConstraint\CrawlerSelectorAttributeValueSame("input[name=\"$fieldName\"]",'value',$expectedValue))
167+
),$message);
168+
}
169+
170+
publicstaticfunctionassertRequestAttributeValueSame(string$name,string$expectedValue,string$message =''):void
171+
{
172+
self::assertThat(static::getRequest(),newResponseConstraint\RequestAttributeValueSame($name,$expectedValue),$message);
173+
}
174+
175+
publicstaticfunctionassertRouteSame($expectedRoute,array$parameters = [],string$message =''):void
176+
{
177+
$constraint =newResponseConstraint\RequestAttributeValueSame('_route',$expectedRoute);
178+
$constraints = [];
179+
foreach ($parametersas$key =>$value) {
180+
$constraints[] =newResponseConstraint\RequestAttributeValueSame($key,$value);
181+
}
182+
if ($constraints) {
183+
$constraint = LogicalAnd::fromConstraints($constraint, ...$constraints);
184+
}
185+
186+
self::assertThat(static::getRequest(),$constraint,$message);
187+
}
188+
189+
privatestaticfunctiongetClient():KernelBrowser
190+
{
191+
if (!static::$clientinstanceof KernelBrowser) {
192+
static::fail(\sprintf('A client must be set to make assertions on it. Did you forget to call "%s::createClient"?',__CLASS__));
193+
}
194+
195+
returnstatic::$client;
196+
}
197+
198+
privatestaticfunctiongetCrawler():Crawler
199+
{
200+
if (!$crawler =static::getClient()->getCrawler()) {
201+
static::fail('A client must have a crawler to make assertions. Did you forget to make an HTTP request?');
202+
}
203+
204+
return$crawler;
205+
}
206+
207+
privatestaticfunctiongetResponse():Response
208+
{
209+
if (!$response =static::getClient()->getResponse()) {
210+
static::fail('A client must have an HTTP Response to make assertions. Did you forget to make an HTTP request?');
211+
}
212+
213+
return$response;
214+
}
215+
216+
privatestaticfunctiongetRequest():Request
217+
{
218+
if (!$request =static::getClient()->getRequest()) {
219+
static::fail('A client must have an HTTP Request to make assertions. Did you forget to make an HTTP request?');
220+
}
221+
222+
return$request;
223+
}
224+
}

‎src/Symfony/Bundle/FrameworkBundle/Test/WebTestCase.php‎

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,18 @@
2121
*/
2222
abstractclass WebTestCaseextends KernelTestCase
2323
{
24+
use WebTestAssertions;
25+
26+
/** @var Client|null */
27+
protectedstatic$client;
28+
29+
protectedfunctiondoTearDown():void
30+
{
31+
parent::doTearDown();
32+
33+
static::$client =null;
34+
}
35+
2436
/**
2537
* Creates a KernelBrowser.
2638
*
@@ -44,6 +56,6 @@ protected static function createClient(array $options = [], array $server = [])
4456

4557
$client->setServerParameters($server);
4658

47-
return$client;
59+
returnstatic::$client =$client;
4860
}
4961
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp