在被模拟的对象上断言已更改的状态

时间:2015-07-09 09:01:33

标签: unit-testing mocking phpunit mockery

我想对一个以某个对象作为输入的函数进行单元测试, 处理它,当它完成时,该对象的状态应该已经改变为某个值。

由于我想做“真正的”单元测试(据我所知),我只想使用提供处理功能的类, 并模拟使用的所有其他类。 为了满足这个要求,我需要模拟正在处理的对象;但是当它只是一个模拟时,它就没有任何可以改变的真实状态了。

伪代码示例:

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

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

问题是我需要模拟“getState”方法来准备测试的起始状态,等等 之后我再也不能使用真正的方法了。 你知道我怎么能做到这一点,或者我应该如何改变测试的设计?

PS:我实际上正在使用PHPUnit和Mockery。

感谢您的任何建议。

1 个答案:

答案 0 :(得分: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/

希望这个帮助

相关问题