我想对一个以某个对象作为输入的函数进行单元测试, 处理它,当它完成时,该对象的状态应该已经改变为某个值。
由于我想做“真正的”单元测试(据我所知),我只想使用提供处理功能的类, 并模拟使用的所有其他类。 为了满足这个要求,我需要模拟正在处理的对象;但是当它只是一个模拟时,它就没有任何可以改变的真实状态了。
伪代码示例:
object = createMock('SomeClassName');
object.whenReceives('getState').shouldReturn(0);
Processor.process(object);
assertEquals(expected = 1, actual = object.getState());
问题是我需要模拟“getState”方法来准备测试的起始状态,等等 之后我再也不能使用真正的方法了。 你知道我怎么能做到这一点,或者我应该如何改变测试的设计?
PS:我实际上正在使用PHPUnit和Mockery。
感谢您的任何建议。
答案 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/
希望这个帮助