2013-12-04 2 views
1

У меня вопрос о PHPUnit. Я хочу, чтобы написать тест для следующего класса Message и хочу, чтобы покрыть default: case в моих тестах, передавая недопустимый $type в методе isValidMessageType(). Предположим, что разработчик добавит еще один тип, т. Е. 3, в метод isValidMessageType(), но забывает добавить случай переключения в метод SendMessage(), в этом случае случай по умолчанию выдаст исключение.PHPUnit - тестовый коммутатор/случаи по умолчанию

class Message 
{ 

    public function isValidMessageType($type) 
    { 
     return ($type == 1 || $type == 2) 
    } 

    public function SendMessage($type) 
    { 

     if(!$this->isValidMessageType($type)){ 
      throw new Exception('Invalid Message type'); 
     } 

     switch ($type) { 
      case 1: 
       // do something 
       break; 
      case 2: 
       // do something 
       break; 
      default: 
       throw new Exception('Invalid Message type'); 
     } 

    } 

} 

Может кто-нибудь, пожалуйста, помогите мне, как этого достичь?

Заранее спасибо

ответ

0

Следующее будет проверяться на результат isValidMessageType для TRUE/FALSE, а затем будет проверять возвращаемое значение из SendMEssage(). Однако вам нужно вернуть что-то из SendMessage() или иметь что-то, что можно протестировать, чтобы действительно проверить код.

class Message_TEST extends PHPUnit_Framework_TestCase 
{ 
    protected $TestObject; 

    protected function setUp() 
    { 
     $this->TestObject = new Message(); 
    } 

    protected function tearDown() 
    { 
    } 

    public function testisValidMessageType() 
    { 
     $this->assertTrue($this->TestObject->isValidMessageType(1)); 
     $this->assertTrue($this->TestObject->isValidMessageType(2)); 

     $this->assertFalse($this->TestObject->isValidMessageType(3)); 
     $this->assertFalse($this->TestObject->isValidMessageType('A')); 
    } 

    /** 
    * @expectedException \Exception 
    */ 
    public function testSendMessageException() 
    { 
     $this->TestObject->isValidMessageType(3); 
    } 

    public function testSendMessage() 
    { 
     $this->assertEquals('Need Return from SendMessage', $this->TestObject->SendMessage(1)); 
     $this->assertEquals('Need Return from SendMessage', $this->TestObject->SendMessage(2)); 
    } 
} 
1

Проблема здесь состоит в том, что вы дублируется логику для определения, является ли $ правильный тип или нет. Сначала вы проверяете его с помощью метода isValidMessageType, но затем вы проверяете его снова в случае по умолчанию.

Вы не должны писать код, который вам не нужен. Просто убедитесь, что если вы передадите недопустимый тип $, будет выбрано Исключение. Вам нужно сделать это только один раз. Вы можете избавиться от метода isValidMessageType, и система будет работать должным образом.

+0

У меня есть еще один оффтоп вопрос, Предположим, у меня есть метод GetUserDetails() в классе «Пользователь», и есть 10 возможных тестов, я должен добавлять все эти 10 тестовых случаев в testGetUserDetails() метод в классе UserTest или я пишу каждый случай в отдельных методах, таких как testGetUserDetailsCaseA(), testGetUserDetailsCaseB(), testGetUserDetailsCaseC() и т. д. и т. д.? – user2909892

+0

Я предлагаю разрешить этот ответ и открыть новый. Так что все прочтут. – gontrollez

1

Я считаю, используя «PHPUnit --coverage-HTML OutputDir --debug» и проверка отчета (index.html в OutputDir) полезно время от времени, как это, чтобы увидеть, где тесты собираются.

BTW Каждый тест должен проверять только одну вещь, иначе, когда тест не удастся, вы потратите дополнительное время на отладку своего теста, а также вашего кода. Рассмотрите возможность пересмотра, как показано ниже. Вы можете сократить повторение путем тестирования только одного «хорошего» значения и одного «плохого» значения, если вы хотите, если вам не нужно проверять больше случаев.

public function testOneisValidMessageType() 
{ 
    $this->assertTrue($this->TestObject->isValidMessageType(1)); 
} 

public function testTwoisValidMessageType() 
{ 
    $this->assertTrue($this->TestObject->isValidMessageType(2)); 
} 

public function testThreeisNotValidMessageType() 
{ 
    $this->assertFalse($this->TestObject->isValidMessageType(3)); 
} 

public function testStringisNotValidMessageType() 
{ 
    $this->assertFalse($this->TestObject->isValidMessageType('A')); 
} 
Смежные вопросы