2015-06-05 27 views
3

我正在执行到我的Laravel 4应用程序的单元测试,但我坚持嘲笑访问属性。如何模拟Laravel的雄辩访问属性

我有一个Eloquent模型,其中有一个Accessor属性。我试图嘲笑这个模型,并在调用这个访问器属性时返回一个值。但是我找不到任何解决方案来使它工作。

我的超级简单的用户类。

class User extends Eloquent { 
    public function getFullNameAttribute() { 
     return $this->first_name . ' ' . $this->last_name; 
    } 
} 

我试过如下:

$user_mock = m::mock('MyApp\Models\User'); 

$user_mock->shouldReceive('__get')->with('full_name')->andReturn('John Snow'); // doesn't work 
$user_mock->shouldReceive('getAttribute')->with('full_name')->andReturn('John Snow'); // doesn't work 
$user_mock->shouldReceive('getFullNameAttribute')->andReturn('John Snow'); // doesn't work 

echo $user_mock->full_name; // --> " " 

我刚刚得到一个空的空间回来,这表明原有的功能仍然被调用。

回答

-1

看着Mockery的文档,看起来它不支持嘲讽的魔法方法。你会基本上只需要使用普通的分配设置属性:

$user_mock = m::mock('MyApp\Models\User'); 
$user_mock->first_name = 'John Snow'; 

Mockery docs

+1

这是为什么downvoted?这不行?不要低估没有明确的理由,如果你这样做,请添加评论解释。 – VinGarcia

1

尽量不要嘲笑雄辩的车型。这是“嘲笑你不拥有的类型”的一个例子。如果Laravel在新版本中更改了雄辩的内部结构,并且在单元测试中嘲笑了它们,那么测试可能会提供误报。

另外我觉得尝试和嘲笑它们很奇怪。你失去了这些实体映射到现实世界事物的想法,而这是业务逻辑组件需要独立测试(与依赖关系嘲弄)。

使用时我发现存取是很有帮助的包装在另一个抽象,例如在库层:

​​

我觉得存取使客户端代码可读性强。这是完全可测试的,并且与数据库的整个交互是可嘲弄的,如果您有数千次测试,这可能有助于减少开销。