Php 拉威尔5模型模拟
我在不同的地方看到过一些关于这一点的帖子,它们似乎都有类似的答案。然而,就我的一生而言,我无法让嘲弄对象正常工作 属性模型如下所示Php 拉威尔5模型模拟,php,phpunit,laravel-5,mockery,Php,Phpunit,Laravel 5,Mockery,我在不同的地方看到过一些关于这一点的帖子,它们似乎都有类似的答案。然而,就我的一生而言,我无法让嘲弄对象正常工作 属性模型如下所示 namespace App\Models; use Illuminate\Database\Eloquent\Model; class Attribute extends Model { public function test() { return (new \App\Models\Value())->hello();
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Attribute extends Model {
public function test()
{
return (new \App\Models\Value())->hello();
}
}
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Value extends Model
{
public function hello()
{
return 'goodbye';
}
}
use App\Models\Attribute;
class AttributeModelTest extends TestCase
{
public function testThing()
{
$mock = Mockery::mock('\App\Models\Value');
$mock->shouldReceive('hello')
->once()
->andReturn('hello');
$this->app->instance('\App\Models\Value', $mock);
$a = new \App\Models\Attribute();
$return = $a->test();
var_dump($return);
}
}
像这样的价值模型
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Attribute extends Model {
public function test()
{
return (new \App\Models\Value())->hello();
}
}
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Value extends Model
{
public function hello()
{
return 'goodbye';
}
}
use App\Models\Attribute;
class AttributeModelTest extends TestCase
{
public function testThing()
{
$mock = Mockery::mock('\App\Models\Value');
$mock->shouldReceive('hello')
->once()
->andReturn('hello');
$this->app->instance('\App\Models\Value', $mock);
$a = new \App\Models\Attribute();
$return = $a->test();
var_dump($return);
}
}
PHPUnit测试是这样的
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Attribute extends Model {
public function test()
{
return (new \App\Models\Value())->hello();
}
}
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Value extends Model
{
public function hello()
{
return 'goodbye';
}
}
use App\Models\Attribute;
class AttributeModelTest extends TestCase
{
public function testThing()
{
$mock = Mockery::mock('\App\Models\Value');
$mock->shouldReceive('hello')
->once()
->andReturn('hello');
$this->app->instance('\App\Models\Value', $mock);
$a = new \App\Models\Attribute();
$return = $a->test();
var_dump($return);
}
}
PHPUnit输出“再见”,我认为我在告诉它在模拟中返回“你好”,但它没有。你知道我做错了什么吗?如评论中所述: 更改
return(new\App\Models\Value())->hello()使用返回(\App::make('App\Models\Value'))->hello()代码>
在测试中:$a=new\App\Models\Attribute()代码>带有$a=App::make('App\Models\Attribute')代码>因此Laravel将通过容器解析依赖关系如果更改$a=new\App\Models\Attribute(),会发生什么情况;使用$a=App::make('App\Models\Value')?如果我这样做,它将基本上与调用$mock->hello()
相同。不确定是否清楚,但我试图模拟属性所使用的响应。如果我调用$mock->hello(),它将返回预期的“hello”值。你是对的,我对这两个类感到困惑,我认为如果你更改return(new\App\Models\value())->hello(),它应该可以工作;返回(App::make('App\Models\Value'))->hello();在测试中:$a=new\App\Models\Attribute();使用$a=App::make('App\Models\Attribute');所以Laravel将通过容器解决依赖关系。是的,你是对的,我认为这是你可能建议的路径,并开始遵循它,但遇到了一些障碍。你的提示让我更深入地挖掘并尝试一些有效的方法,除非你愿意,否则我会回答我自己的问题。在模型中,必须执行\App::make('Blah')
,否则名称空间将杀死它