function it_runs_let_and_letgo_maintainer_before_and_after_each_example_if_the_example_throws_an_exception(ExampleNode $example, SpecificationNode $specification, ReflectionClass $specReflection, $context, ReflectionMethod $exampReflection, LetAndLetgoMaintainer $maintainer, SpecificationInterface $context) { $example->isPending()->willReturn(false); $example->getFunctionReflection()->willReturn($exampReflection); $example->getSpecification()->willReturn($specification); $specification->getClassReflection()->willReturn($specReflection); $specReflection->newInstanceArgs()->willReturn($context); $exampReflection->getParameters()->willReturn(array()); $exampReflection->invokeArgs($context, array())->willThrow('RuntimeException'); $maintainer->getPriority()->willReturn(1); $maintainer->supports($example)->willReturn(true); $maintainer->prepare($example, Argument::cetera())->shouldBeCalled(); $maintainer->teardown($example, Argument::cetera())->shouldBeCalled(); $this->registerMaintainer($maintainer); $this->run($example); }
/** * @param SpecificationInterface $context * @param ExampleNode $example * * @throws \PhpSpec\Exception\Example\PendingException * @throws \Exception */ protected function executeExample(SpecificationInterface $context, ExampleNode $example) { if ($example->isPending()) { throw new ExampleException\PendingException(); } $matchers = new MatcherManager($this->presenter); $collaborators = new CollaboratorManager($this->presenter); $maintainers = array_filter($this->maintainers, function ($maintainer) use($example) { return $maintainer->supports($example); }); // run maintainers prepare foreach ($maintainers as $maintainer) { $maintainer->prepare($example, $context, $matchers, $collaborators); } // execute example $reflection = $example->getFunctionReflection(); try { $reflection->invokeArgs($context, $collaborators->getArgumentsFor($reflection)); } catch (\Exception $e) { $this->runMaintainersTeardown($this->searchExceptionMaintainers($maintainers), $example, $context, $matchers, $collaborators); throw $e; } $this->runMaintainersTeardown($maintainers, $example, $context, $matchers, $collaborators); }