【发布时间】:2016-01-15 18:49:45
【问题描述】:
假设我有两个需要使用Foo 对象的测试用例。
在第一个测试用例中,我需要 Foo 被模拟,所以我正在这样做
class TestCaseA extends \Orchestra\Testbench\TestCase {
function testA() {
$foo = \Mockery::mock('Foo')->shouldReceive('baz')->once();
Something::method_That_Uses_A_Dependency_Injected_Foo();
}
}
在第二个测试用例中,我需要真正的Foo 实现,所以我在做
class TestCaseB extends \Orchestra\Testbench\TestCasez
function testB() {
$foo = new Foo();
$foo->baz();
}
}
当TestCaseA 首先运行时,TestCaseB 失败,因为它实际上是在使用模拟实例,我得到一个
BadMethodCallException: Method Foo::baz() does not exist on this mock object
相反,当TestCaseB 首先运行时,我从 Mockery 得到一个异常,该异常表明 “无法创建模拟,因为已经加载了真正的 Foo 对象。”(抱歉,但是我忘记了实际的异常)。
我认为我需要的是测试用例自动加载器之间的一种隔离,但我不知道如何实现这一点。有什么提示吗?
附:我不确定管弦乐/测试台实际上是否参与了这个问题,我认为这主要是一个嘲弄的事情。
【问题讨论】:
标签: php unit-testing laravel mockery