【问题标题】:Asserting a changed state on a mocked object在模拟对象上断言已更改的状态
【发布时间】:2015-09-27 13:15:59
【问题描述】:

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

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

示例伪代码:

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

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

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

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

感谢您的建议。

【问题讨论】:

    标签: unit-testing mocking 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/

    希望有帮助

    【讨论】:

      猜你喜欢
      • 2016-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多