PHP7

2016-01-02 7 views
7

में PHPSpec कैचिंग टाइपररर मैं स्केलर प्रकार संकेत और PHP7 में सख्त प्रकार के साथ एक उदाहरण विधि का परीक्षण करना चाहता हूं। जब मैं कोई तर्क नहीं देता हूं, तो विधि को TypeError फेंकना चाहिए। PHPSpec गंभीर त्रुटि लौट:PHP7

Uncaught TypeError: Argument 1 passed to Example::test

<?php 

class Example 
{ 
    public function test(string $name) 
    { 
     $this->name = $name; 
    } 
} 


class ExampleSpec extends ObjectBehavior 
{ 
    function it_is_initializable() 
    { 
     $this->shouldHaveType('Test\Example'); 
    } 

    function it_check_test_method_when_not_pass_argument() 
    { 
     $this->shouldThrow('\TypeError')->during('test'); 
    } 
} 

शुरुआत में मैं घोषणा: declare(strict_types=1);

क्या गलत है? मैं TypeError फेंकने का परीक्षण कैसे करूं?

+0

तो अपवाद फेंक दिया गया है लेकिन बेकार है? या इसे फेंक दिया नहीं जा रहा है और यह होना चाहिए? – Will

+0

विधि फेंक टाइपरर और मैं TypeError पकड़ना चाहता हूँ। मैं $- का उपयोग करना चाहता हूं-> चाहिए ('\ TypeError') -> ('test') के दौरान। पीएचपीएसपीसी में यह विधि काम करता है जब विधि अपवाद वापस करता है लेकिन TypeError नहीं। – Matrix12

+0

क्या आप PHPSpec का नवीनतम संस्करण उपयोग कर रहे हैं? – Will

उत्तर

3

मेरे लिए यह है कि अगर मैं इस के साथ इकाई परीक्षण व्याख्या काम करता है।

5

आगे की जांच के बाद, यह एक पीएचपीएसपीसी बग है, और here की सूचना दी गई है। बग कई महीनों में तय नहीं किया गया है, इसलिए मैं इस पर टिप्पणी करने का सुझाव दूंगा।

यदि आप src/PhpSpec/Matcher/ThrowMatcher.php में कोड देखते हैं, तो आप देख सकते हैं कि PHPSpec उन अपवादों को पकड़ता है जो 'Exception' प्राप्त करते हैं और फिर उस अपवाद के इंस्टेंस प्रकार की जांच करते हैं। लेकिन, TypeErrorException से प्राप्त नहीं है, यह Error से प्राप्त होता है। Exception के साथ यह एकमात्र चीज है, यह है कि वे दोनों Throwable इंटरफ़ेस को लागू करते हैं।

उदाहरण के लिए:

101  public function verifyPositive($callable, array $arguments, $exception = null) 
102  { 
103   try { 
104    call_user_func_array($callable, $arguments); 
105   } catch (\Exception $e) { 
106    if (null === $exception) { 
107     return; 
108    } 
109 
110    if (!$e instanceof $exception) { 
111     throw new FailureException(sprintf(
112      'Expected exception of class %s, but got %s.', 
113      $this->presenter->presentValue($exception), 
114      $this->presenter->presentValue($e) 
115    )); 
116    } 

रिपोर्ट बग, इन विवरणों की व्याख्या, और TypeError की विरासत के बारे में उन्हें this documentation दिखा।

/** 
* @expectedException \TypeError 
*/ 

फिर अपने परीक्षण हरा है:

+1

मैंने उस बग की सूचना दी। मुझे नहीं पता कि यह बग कब तय किया जाएगा। – Matrix12

+0

@ मैट्रिक्स 12 आप त्रुटियों को पकड़ने के लिए (त्रुटि $ ई) पकड़ सकते हैं ... या किसी भी विशिष्ट वर्ग जो थ्रोबल को इंटरफेस करता है –

संबंधित मुद्दे