当我调用路由时,如何为控制器创建部分模拟?

时间:2015-05-11 15:46:42

标签: php laravel-4 laravel-5 mockery 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 个答案:

没有答案