【问题标题】:Laravel 5 Model mockingLaravel 5 模型模拟
【发布时间】: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


【解决方案1】:

如 cmets 中所述:

return (new \App\Models\Value())->hello(); 更改为return (\App::make('App\Models\Value'))->hello();

在测试中:$a = new \App\Models\Attribute();$a = App::make('App\Models\Attribute'); 所以 Laravel 将通过容器解决依赖关系

【讨论】:

    猜你喜欢
    • 2015-03-12
    • 2016-08-17
    • 2023-03-22
    • 2015-05-07
    • 2020-02-29
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    • 2015-06-23
    相关资源
    最近更新 更多