在模拟对象上声明已更改的状态

Asserting a changed state on a mocked object

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

因为我想做"real"单元测试(据我了解),我只想使用提供处理功能的class, 并模拟使用的所有其他 classes。 为了满足这个要求,我需要模拟正在处理的对象;但是当它只是一个模拟时,它就没有真正的状态可以改变了。

示例伪代码:

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

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

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

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

感谢您的任何建议。

你不是在处理真实的对象,所以你不会向对象询问更改后的值,但你可以断言有人用它拨号来改变状态。例如:

$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/

希望这对您有所帮助