我有一个类,我正在尝试测试其中一个方法,但其中一个方法在同一个类上调用静态方法。我想知道如何在没有静态方法的情况下测试第一种方法,以便我只测试第一种方法?
这是一个愚蠢的课程。
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,类已经存在”
答案 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;
创建该类的新实例。正如您在我的回复中所看到的,您不应该创建该类的新实例,而是创建一个模拟,您将使用该模拟来调用您要测试的方法。