2012-09-17 64 views
4

我剛學習單元測試。這PHP代碼我如何使用phpunit單元測試無效參數?

class Foo { 
    public function bar($arg) { 
     throw new InvalidArgumentException(); 
    } 
} 

...

class FooTest extends PHPUnit_Framework_TestCase { 
    public function testBar() { 
     $this->setExpectedException('InvalidArgumentException'); 
     $dummy = Foo::bar(); 
    } 
} 

失敗Failed asserting that exception of type "PHPUnit_Framework_Error_Warning" matches expected exception "InvalidArgumentException".出自PHPUnit。如果任何值被放在Foo::bar()測試中,那麼它當然按預期工作。有沒有辦法測試空參數?還是我錯誤地嘗試創建一個不應該在單元測試範圍內的測試?

+1

'bar()'應該聲明爲'static',因爲您在沒有'$ this'的情況下調用它' – yegor256

回答

6

你不應該測試這種情況。單元測試的目的是確保被測試類按照其「公共接口(函數和屬性)」的「合約」執行。你想要做的是打破合同。正如你所說,它超出了單元測試的範圍。

2

我同意'yegor256'在合同的測試。然而,有些時候我們有可選的參數來使用先前聲明的值,但是如果它們沒有設置,那麼我們會拋出異常。下面顯示了一個稍微修改過的代碼(簡單示例,不好或生產就緒)。

class Foo { 
    ... 
    public function bar($arg = NULL) 
    { 
     if(is_null($arg)  // Use internal setting, or ... 
     { 
        if(! $this->GetDefault($arg)) // Use Internal argument 
        { 
         throw new InvalidArgumentException(); 
        } 
     } 
     else 
     { 
      return $arg; 
     } 
    } 
} 

... 
class FooTest extends PHPUnit_Framework_TestCase { 
    /** 
    * @expectedException InvalidArgumentException 
    */ 
    public function testBar() { 
     $dummy = Foo::bar(); 
    } 

    public function testBarWithArg() { 
     $this->assertEquals(1, Foo:bar(1)); 
    } 
} 
相關問題