2013-03-29 2 views
7

Я хочу использовать PHPUnit для проверки того, что методы вызывают в правильном порядке.PHPUnit: как проверить, что методы вызываются в неправильном порядке?

Моя первая попытка, используя ->at() на макет предмета, не работает. Например, я ожидал следующий потерпеть неудачу, но это не делает:

public function test_at_constraint() 
    { 
    $x = $this->getMock('FirstSecond', array('first', 'second')); 
    $x->expects($this->at(0))->method('first'); 
    $x->expects($this->at(1))->method('second'); 

    $x->second(); 
    $x->first(); 
    }  

Единственный способ, которым я мог думать, что принудительный отказ, если дела были вызваны в неправильном порядке было что-то вроде этого:

public function test_at_constraint_with_exception() 
    { 
    $x = $this->getMock('FirstSecond', array('first', 'second')); 

    $x->expects($this->at(0))->method('first'); 
    $x->expects($this->at(1))->method('first') 
     ->will($this->throwException(new Exception("called at wrong index"))); 

    $x->expects($this->at(1))->method('second'); 
    $x->expects($this->at(0))->method('second') 
     ->will($this->throwException(new Exception("called at wrong index"))); 

    $x->second(); 
    $x->first(); 
    } 

Есть ли более элегантный способ сделать это? Благодаря!

+0

Посмотрите на http://api.drupal.org/api/drupal/core%21vendor%21phpunit%21phpunit-mock-objects%21PHPUnit%21Framework%21MockObject%21Matcher%21InvokedAtIndex. php/function/PHPUnit_Framework_MockObject_Matcher_InvokedAtIndex% 3A% 3Averify/8 – jcbwlkr

+0

Я думаю, что это поможет, но я не уверен. – jcbwlkr

+0

Эта страница, по-видимому, указывает, что '-> at()' не вызовет сбой, если его метод вызывается с другим индексом, который уже доказал мой первый тестовый пример. Было ли что-то еще, что вы имели в виду на этой странице, которое было бы полезно? – des4maisons

ответ

7

Для того, чтобы ваши ожидания работали, вам нужно привлечь любые InvocationMocker. Например, это должно работать:

public function test_at_constraint() 
{ 
    $x = $this->getMock('FirstSecond', array('first', 'second')); 
    $x->expects($this->at(0))->method('first')->with(); 
    $x->expects($this->at(1))->method('second')->with(); 

    $x->second(); 
    $x->first(); 
} 
+0

Помимо того, что в моей версии phpunit он не работает, «Mocked method does not exist», это работает! ЗДОРОВО! – des4maisons

Смежные вопросы