【发布时间】:2015-08-08 07:56:17
【问题描述】:
我在各个地方看到了一些关于此的帖子,他们似乎都有类似的答案。但是对于我的生活,我无法让 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 Value extends Model
{
public function hello()
{
return 'goodbye';
}
}
PHPUnit 测试如下所示
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 输出'goodbye',虽然我告诉它在模拟中返回'hello',但它没有。有什么想法我可能做错了吗?
【问题讨论】:
-
如果将 $a = new \App\Models\Attribute(); 更改为 $a = App::make('App\Models\值'); ?
-
如果我这样做,它基本上与调用
$mock->hello()相同。不确定是否清楚,但我试图模拟Attribute使用的响应。如果我调用 $mock->hello() 它返回 'hello' 的预期值 -
你说得对,我对这两个类都感到困惑,我认为如果你改变 return (new \App\Models\Value())->hello(); 应该可以工作 i> 与 return (App::make('App\Models\Value'))->hello(); 并在测试中: $a = new \App\Models\Attribute (); 与 $a = App::make('App\Models\Attribute'); 这样 Laravel 将通过容器解决依赖关系。
-
是的,你是对的,我认为这是你可能建议的路径,并开始遵循它,但遇到了一点障碍。你的提示让我更深入地挖掘并尝试一些可行的方法,除非你愿意,否则我会回答我自己的问题。在模型中执行
\App::make('Blah')很重要,否则命名空间会杀死它
标签: php phpunit laravel-5 mockery