public function testRunFailedTestEvent() { $events = array(); $this->dispatcher->addListener('test.fail', function () use(&$events) { $events[] = 'test.fail'; }); $this->testcase->getScenario()->assertion(array('seeEquals', 5, 6)); $this->testcase->run(); $this->assertEquals($events, array('test.fail')); }
/** * Checks item in Memcached exists and the same as expected. * * @param string $referenceImageIdentifier * @param null|string $selector * @throws ModuleException */ public function seeNoDifferenceToReferenceImage($referenceImageIdentifier, $selector = null) { if ($selector === null) { $selector = 'body'; } $elements = $this->webDriver->_findElements($selector); if (count($elements) == 0) { throw new ElementNotFound($selector); } elseif (count($elements) > 1) { throw new ModuleException(__CLASS__, 'Multiple elements found for given selector "' . $selector . '" but need exactly one element!'); } /** @var RemoteWebElement $element */ $image = $this->_createScreenshot($referenceImageIdentifier, reset($elements)); $windowSizeString = $this->moduleFileSystemUtil->getCurrentWindowSizeString($this->webDriver); $referenceImagePath = $this->moduleFileSystemUtil->getReferenceImagePath($referenceImageIdentifier, $windowSizeString); if (!file_exists($referenceImagePath)) { // Ensure that the target directory exists $this->moduleFileSystemUtil->createDirectoryRecursive(dirname($referenceImagePath)); copy($image->getImageFilename(), $referenceImagePath); $this->currentTestCase->markTestIncomplete('Reference Image does not exist. Test is skipeed but will now copy reference image to target directory...'); } else { $referenceImage = new \Imagick($referenceImagePath); /** @var \Imagick $comparedImage */ list($comparedImage, $difference) = $referenceImage->compareImages($image, \Imagick::METRIC_MEANSQUAREERROR); $calculatedDifferenceValue = round((double) substr($difference, 0, 6) * 100, 2); $this->currentTestCase->getScenario()->comment('Difference between reference and current image is around ' . $calculatedDifferenceValue . '%'); if ($calculatedDifferenceValue > $this->config['maxDifference']) { $failImagePath = $this->moduleFileSystemUtil->getFailImagePath($referenceImageIdentifier, $windowSizeString, 'diff'); $this->moduleFileSystemUtil->createDirectoryRecursive(dirname($failImagePath)); $image->writeImage($this->moduleFileSystemUtil->getFailImagePath($referenceImageIdentifier, $windowSizeString, 'fail')); $comparedImage->setImageFormat('png'); $comparedImage->writeImage($failImagePath); $this->fail('Image does not match to the reference image.'); } } }
/** * Very magical function that generates Mock methods for expected assertions * Allows the declaration of seeMethodInvoked, seeMethodNotInvoked, etc, AFTER the 'execute' command * */ protected function createMocks() { $scenario = $this->test->getScenario(); $steps = $scenario->getSteps(); if (!isset($steps[$scenario->getCurrentStep()])) { throw new \Exception("New steps were added to scenario in realtime. Can't proceed.\nRemove loops from your unit test to fix it"); } for ($i = $scenario->getCurrentStep() + 1; $i < count($steps); $i++) { $step = $steps[$i]; if (strpos($action = $step->getAction(), 'seeMethod') === 0) { $arguments = $step->getArguments(false); $mock = array_shift($arguments); $function = array_shift($arguments); $params = array_shift($arguments); foreach ($this->stubs as $stub) { if (get_class($stub) == get_class($mock)) { $mock = $stub; } } $invoke = false; switch ($action) { case 'seeMethodInvoked': case 'seeMethodInvokedAtLeastOnce': if (!$mock) { throw new \InvalidArgumentException("Stub class not defined"); } $invoke = new \PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastOnce(); break; case 'seeMethodInvokedOnce': if (!$mock) { throw new \InvalidArgumentException("Stub class not defined"); } $invoke = new \PHPUnit_Framework_MockObject_Matcher_InvokedCount(1); break; case 'seeMethodNotInvoked': if (!$mock) { throw new \InvalidArgumentException("Stub class not defined"); } $invoke = new \PHPUnit_Framework_MockObject_Matcher_InvokedCount(0); break; case 'seeMethodInvokedMultipleTimes': if (!$mock) { throw new \InvalidArgumentException("Stub class not defined"); } $times = $params; if (!is_int($times)) { throw new \InvalidArgumentException("Invoked times count should be an integer"); } $params = $arguments; $invoke = new \PHPUnit_Framework_MockObject_Matcher_InvokedCount($times); break; default: } if ($invoke) { $mockMethod = $mock->expects($invoke)->method($function); $this->debug(get_class($invoke) . ' attached'); if ($params) { call_user_func_array(array($mockMethod, 'with'), $params); $this->debug('with ' . json_encode($params)); } } } if ($step->getAction() == 'executeTestedMethod') { break; } if ($step->getAction() == 'execute') { break; } if ($step->getAction() == 'executeTestedMethodOn') { break; } if ($step->getAction() == 'executeTestedMethodWith') { break; } } }
public function _before(\Codeception\TestCase $test) { $this->scenario = $test->getScenario(); }