来自与测试方法使用的同一类的模拟方法
Posted
技术标签:
【中文标题】来自与测试方法使用的同一类的模拟方法【英文标题】:Mock method from the same class that tested method is using 【发布时间】:2018-07-17 21:00:27 【问题描述】:我有以下代码:
class Foo()
public function someMethod()
...
if ($this->otherMethod($lorem, $ipsum))
...
...
我正在尝试测试 someMethod(),我不想测试 otherMethod(),因为它非常复杂并且我有专门的测试 - 在这里我只想模拟它并返回特定值。 所以我尝试:
$fooMock = Mockery::mock(Foo::class)
->makePartial();
$fooMock->shouldReceive('otherMethod')
->withAnyArgs()
->andReturn($otherMethodReturnValue);
我正在测试中
$fooMock->someMethod()
但它使用原始(非模拟)方法 otherMethod() 并打印错误。
Argument 1 passed to Mockery_3_Foo::otherMethod() must be an instance of SomeClass, boolean given
你能帮帮我吗?
【问题讨论】:
打印什么错误? 打印错误是因为我正在使用的模拟还没有为这个方法准备好,我想模拟这个方法,因为我正在单独测试它。 错误无关紧要 - 主要问题是从测试期间使用的测试方法的服务中模拟一种方法 【参考方案1】:使用它作为模板来模拟一个方法:
<?php
class FooTest extends \Codeception\TestCase\Test
/**
* @test
* it should give Joy
*/
public function itShouldGiveJoy()
//Mock otherMethod:
$fooMock = Mockery::mock(Foo::class)
->makePartial();
$mockedValue = TRUE;
$fooMock->shouldReceive('otherMethod')
->withAnyArgs()
->andReturn($mockedValue);
$returnedValue = $fooMock->someMethod();
$this->assertEquals('JOY!', $returnedValue);
$this->assertNotEquals('BOO!', $returnedValue);
class Foo
public function someMethod()
if($this->otherMethod())
return "JOY!";
return "BOO!";
public function otherMethod()
//In the test, this method is going to get mocked to return TRUE.
//that is because this method ISN'T BUILT YET.
return false;
【讨论】:
嗯,我很确定这是我在原始帖子中所做和描述的,但它不起作用。我不得不以肮脏的方式处理它并开始执行下一个任务。无论如何,谢谢你的帮助,我会尽快回到这个任务,然后再试一次。 太棒了!我想你正在发生的事情是在“......”部分的某个地方。您的架构基本上是正确的。如果您同意,请支持此答案。 :)以上是关于来自与测试方法使用的同一类的模拟方法的主要内容,如果未能解决你的问题,请参考以下文章
如何使用PHPUnit测试一个方法调用了同一个类的其他方法,但是没有返回值