2015-07-09 6 views
2

Я бы хотел, чтобы блок тестировал функцию, которая принимает определенный объект в качестве входных данных, обрабатывает его, и когда он закончен, состояние этого объекта должно быть изменено на определенное значение.Утверждение измененного состояния на издеваемом объекте

Как я хочу сделать «реальное» модульное тестирование (как я понимаю), я хочу использовать только класс, предоставляющий функцию обработки, и издеваться над всеми другими используемыми классами. Чтобы выполнить это требование, мне нужно высмеять обрабатываемый объект; но когда это всего лишь макет, у него больше нет реального состояния, которое можно было бы изменить.

Пример псевдокода:

object = createMock('SomeClassName'); 
object.whenReceives('getState').shouldReturn(0); 

Processor.process(object); 
assertEquals(expected = 1, actual = object.getState()); 

Проблема заключается в том, что мне нужно издеваться метод «GetState» подготовить исходное состояние для теста, и поэтому после этого я не могу использовать реальный метод больше. Вы знаете, как я могу это достичь, или как мне изменить дизайн теста?

PS: Я использую PHPUnit и Mockery.

Благодарим за любые советы.

ответ

1

Вы не имеете дело с реальным объектом, поэтому вы не запрашиваете у объекта измененное значение, но можете утверждать, что кто-то набирает его для изменения состояния. Как пример:

$mock = Mockery::mock($class); 


// Check that someone call the getstate method only one time 
$mock 
    ->shouldReceive('getState') 
    ->once() 
    ->andReturn(0); 


// Check that someone call change the state method 
$mock 
    ->shouldReceive('setState') 
    ->once() 
    ->with(1); 

Далее ссылки:

http://code.tutsplus.com/tutorials/mockery-a-better-way--net-28097

http://culttt.com/2013/07/22/getting-started-with-mockery/

надежда эта помощь