0

我正在尝试通过调用在 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
    }
}

这对于第一个测试很好,但对于第二个和以后的测试,我声明的实例被遗忘了。

我尝试了很多不同的东西:

  1. 在每个测试中创建(或重新创建)模拟类

  2. 创建模拟类的单个实例作为测试类的属性(在构造函数或setUp方法中对其进行初始化) - 这里的希望是为每个测试使用单个实例可以解决问题。

  3. call()将测试中的方法更改为action()方法(即直接调用控制器方法,而不是通过对路由的 HTTP 请求)。

但这些方法都没有奏效。

可以重写代码,以便将需要模拟的代码移动到一个单独的库类中,然后对其进行模拟和使用,但这增加了一层复杂性。我正在尝试编写一个与特定遗留应用程序的数据库接口的微服务——它只需要做少量的事情,所以我不想在这里添加大量代码。

4

0 回答 0