我正在尝试通过调用在 Lumen 中测试控制器方法$this->call("GET", $route, $data)
。这会调用getUserList
我的控制器类上的方法。
但是我遇到了一个问题,因为该getUserList
方法调用了我需要模拟的控制器类上的一些方法。我试图为控制器类设置一个部分模拟,如下所示:
$controller = Mockery::mock("App\Http\Controllers\MyController[myMethod]");
App::instance("App\Http\Controllers\MyController", $controller);
在每次测试中。
我的测试如下所示:
class ControllerTest extends TestCase {
public function test_1()
{
// set some stuff up
// mock the controller
$controller = Mockery::mock("App\Http\Controllers\MyController[myMethod]");
App::instance("App\Http\Controllers\MyController", $controller);
// call the method
$result = $this->call("GET", $route, $data);
// assert some stuff
}
public function test_2()
{
// set some stuff up
// mock the controller
$controller = Mockery::mock("App\Http\Controllers\MyController[myMethod]");
App::instance("App\Http\Controllers\MyController", $controller);
// call the method
$result = $this->call("GET", $route, $data);
// assert some stuff
}
}
这对于第一个测试很好,但对于第二个和以后的测试,我声明的实例被遗忘了。
我尝试了很多不同的东西:
在每个测试中创建(或重新创建)模拟类
创建模拟类的单个实例作为测试类的属性(在构造函数或
setUp
方法中对其进行初始化) - 这里的希望是为每个测试使用单个实例可以解决问题。call()
将测试中的方法更改为action()
方法(即直接调用控制器方法,而不是通过对路由的 HTTP 请求)。
但这些方法都没有奏效。
我可以重写代码,以便将需要模拟的代码移动到一个单独的库类中,然后对其进行模拟和使用,但这增加了一层复杂性。我正在尝试编写一个与特定遗留应用程序的数据库接口的微服务——它只需要做少量的事情,所以我不想在这里添加大量代码。