我正试图通过调用$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请求到路由)。
但这些方法都不起作用。
我可以重写代码,以便将需要模拟的代码移动到一个单独的库类中,然后对其进行模拟和修改。使用,但这增加了一层复杂性。我正在尝试编写一个与特定遗留应用程序数据库接口的微服务 - 它只需要执行少量操作,因此我不想在此处添加大量代码。