如何使用Laravel 5.1,Phpunit和Mockery测试在同一个类上调用静态方法的雄辩模型方法?

时间:2015-10-28 10:45:33

标签: phpunit laravel-5.1 mockery

我有一个类,我正在尝试测试其中一个方法,但其中一个方法在同一个类上调用静态方法。我想知道如何在没有静态方法的情况下测试第一种方法,以便我只测试第一种方法?

这是一个愚蠢的课程。

class MyEloquentModel extends Model
{
    // Returns input concatenated with output of bar for that input
    public function foo($input) {
        $bar = MyEloquentModel::bar($input);
        return $input." ".$bar;
    }

    // Returns world if input received is hello
    public static function bar($input) {
        if ($input == "hello") {
            return "world"; 
        }
    }
}

这是我尝试过的测试:

class MyEloquentModelTest extends TestCase 
{ 
    public function test_foo_method_returns_correct_value() 
    { 
        // Mock class 
        $mock = \Mockery::mock('App\MyEloquentModel');
        $mock->shouldReceive('hello') 
            ->once() 
            ->with() 
            ->andReturn('world');

        // Create object
        $my_eloquent_model = new MyEloquentModel;

    $this->assertTrue($my_eloquent_model->foo('hello') == "hello world");
    }
}

目前,测试返回“无法加载模拟App \ MyEloquentModel,类已经存在”

1 个答案:

答案 0 :(得分:0)

你可以这样做:

class MyEloquentModelTest extends TestCase 
{ 
    public function test_foo_method_returns_correct_value() 
    { 
        // Mock class 
        $my_mocked_eloquent_model = Mockery::mock('App\MyEloquentModel[bar]');
        $my_mocked_eloquent_model->shouldReceive('bar') 
            ->once() 
            ->with('hello') 
            ->andReturn('world');

    $this->assertEquals("hello world", $my_mocked_eloquent_model->foo('hello'));
    }
}

这是作为MyEloquentModel类的部分模拟创建的,其中只模拟方法“bar”。在shouldReceive方法中,应指定要模拟的方法,而不是方法的参数(如您指定的那样)。相反,对于with方法,您应该指定您希望将哪些参数提供给方法。

您收到的错误“无法加载模拟App \ MyEloquentModel,类已经存在”很可能是因为您首先为MyEloquentModel类指定了一个模拟,然后尝试使用new MyEloquentModel;创建该类的新实例。正如您在我的回复中所看到的,您不应该创建该类的新实例,而是创建一个模拟,您将使用该模拟来调用您要测试的方法。