Skip to content

Commit 76a5724

Browse files
Observer - ObserverSubjectTrait - ObserverStorage Anwendung und UnitTests
1 parent d478fce commit 76a5724

File tree

2 files changed

+94
-37
lines changed

2 files changed

+94
-37
lines changed

src/Observer/ObserverSubjectTrait.php

Lines changed: 1 addition & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,12 @@
88
namespace NiceshopsDev\NiceCore\Observer;
99

1010

11-
use Generator;
1211
use NiceshopsDev\NiceCore\Composite\AbstractComposite;
1312
use SplObserver;
1413

1514
/**
1615
* Trait ObserverSubjectTrait
1716
* @package NiceshopsDev\NiceCore\Observer
18-
* @todo UnitTests
1917
*/
2018
trait ObserverSubjectTrait
2119
{
@@ -29,41 +27,7 @@ trait ObserverSubjectTrait
2927
private function getObserverStorage()
3028
{
3129
if (!$this->observerStorage) {
32-
$this->observerStorage = new class extends AbstractComposite {
33-
34-
35-
/**
36-
* @param SplObserver $observer
37-
*
38-
* @return AbstractComposite
39-
*/
40-
public function addObserver(SplObserver $observer)
41-
{
42-
return $this->addComponent($observer);
43-
}
44-
45-
46-
/**
47-
* @param SplObserver $observer
48-
*
49-
* @return AbstractComposite
50-
*/
51-
public function removeObserver(SplObserver $observer)
52-
{
53-
return $this->removeComponent($observer);
54-
}
55-
56-
57-
/**
58-
* @return Generator for all \SplObserver instances
59-
*/
60-
public function runObserver()
61-
{
62-
foreach ($this->getComponent_List() as $observer) {
63-
yield $observer;
64-
}
65-
}
66-
};
30+
$this->observerStorage = new ObserverStorage();
6731
}
6832

6933
return $this->observerStorage;

test/Observer/ObserverSubjectTraitTest.php

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99

1010
use NiceshopsDev\NiceCore\PHPUnit\DefaultTestCase;
1111
use PHPUnit\Framework\MockObject\MockObject;
12+
use SplObserver;
13+
use SplSubject;
1214

1315
/**
1416
* UnitTest class for TraversableRunner
@@ -55,4 +57,95 @@ public function testTestClassExists()
5557
$this->assertUseTrait(ObserverSubjectTrait::class, $this->object, "Mock Object uses " . ObserverSubjectTrait::class);
5658
}
5759

60+
61+
/**
62+
* @group unit
63+
* @small
64+
*
65+
* @covers ObserverSubjectTrait::getObserverStorage
66+
*/
67+
public function testGetObserverStorage()
68+
{
69+
$observerStorage = $this->invokeMethod($this->object, "getObserverStorage");
70+
$this->assertInstanceOf(ObserverStorage::class, $observerStorage);
71+
$this->assertSame($observerStorage, $this->invokeMethod($this->object, "getObserverStorage"));
72+
}
73+
74+
75+
/**
76+
* @group unit
77+
* @small
78+
*
79+
* @covers ObserverSubjectTrait::attach
80+
*/
81+
public function testAttach()
82+
{
83+
$observerStorage = $this->getMockBuilder(ObserverStorage::class)->disableOriginalConstructor()->setMethods(["addObserver"])->getMock();
84+
85+
/**
86+
* @var SplObserver $observer
87+
*/
88+
$observer = $this->getMockBuilder(SplObserver::class)->getMock();
89+
90+
$this->invokeSetProperty($this->object, "observerStorage", $observerStorage);
91+
$observerStorage->expects($this->once())->method("addObserver")->with(...[$observer]);
92+
93+
$this->assertSame($this->object, $this->object->attach($observer));
94+
}
95+
96+
97+
/**
98+
* @group unit
99+
* @small
100+
*
101+
* @covers ObserverSubjectTrait::c
102+
*/
103+
public function testDetach()
104+
{
105+
$observerStorage = $this->getMockBuilder(ObserverStorage::class)->disableOriginalConstructor()->setMethods(["removeObserver"])->getMock();
106+
107+
/**
108+
* @var SplObserver|MockObject $observer
109+
*/
110+
$observer = $this->getMockBuilder(SplObserver::class)->getMock();
111+
112+
$this->invokeSetProperty($this->object, "observerStorage", $observerStorage);
113+
$observerStorage->expects($this->once())->method("removeObserver")->with(...[$observer]);
114+
115+
$this->assertSame($this->object, $this->object->detach($observer));
116+
}
117+
118+
119+
/**
120+
* @group unit
121+
* @small
122+
*
123+
* @covers ObserverSubjectTrait::notify
124+
*/
125+
public function testNotify()
126+
{
127+
$observerStorage = $this->getMockBuilder(ObserverStorage::class)->disableOriginalConstructor()->setMethods(["runObserver"])->getMock();
128+
129+
$this->object = new class implements SplSubject {
130+
use ObserverSubjectTrait;
131+
};
132+
$this->invokeSetProperty($this->object, "observerStorage", $observerStorage);
133+
134+
/**
135+
* @var SplObserver[]|MockObject[] $arrObserver
136+
*/
137+
$arrObserver = [
138+
$this->getMockBuilder(SplObserver::class)->setMethods(["update"])->getMock(),
139+
$this->getMockBuilder(SplObserver::class)->setMethods(["update"])->getMock(),
140+
$this->getMockBuilder(SplObserver::class)->setMethods(["update"])->getMock(),
141+
];
142+
143+
foreach ($arrObserver as $observer) {
144+
$observer->expects($this->once())->method("update")->with(...[$this->object]);
145+
}
146+
147+
$observerStorage->expects($this->once())->method("runObserver")->willReturn($arrObserver);
148+
149+
$this->assertSame($this->object, $this->object->notify());
150+
}
58151
}

0 commit comments

Comments
 (0)