【问题标题】:Laravel - Testing RepositoriesLaravel - 测试仓库
【发布时间】:2014-03-12 07:06:12
【问题描述】:

我需要测试一个存储库,它有一个通过构造函数注入的 Eloquent 模型。

class EloquentOrderRepository implements OrderRepositoryInterface
{

    protected $model;

    public function __construct(Order $model)
    {
        $this->model = $model;
    }

    public function calculateValues(array $deliveryOption = null)
    {
        if (! is_null($deliveryOption)) {
            $this->model->value_delivery = (float) number_format($deliveryOption['price'], 2);
        }

        $this->model->value_products = (float) number_format($this->model->products->getTotal(), 2);
        $this->model->value_total    = (float) $this->model->value_products + $this->model->value_delivery;
    }
}

我的问题是当我调用$this->model->value_products(或任何属性)时。 Eloquent 模型尝试调用 setAttribute 方法,该方法在模拟模型中不存在。如果我 mock 这个方法,我无法正确设置属性,我的测试断言会失败。

这是我的测试:

<?php
class EloquentOrderRepositoryTest extends \PHPUnit_Framework_TestCase
{

    protected $model, $repository;

    public function setUp()
    {
        $this->model = Mockery::mock('Order');
    }

    public function test_calculate_values()
    {
        $repository = new EloquentOrderRepository($this->model);

        $this->model->products = m::mock('SomeCollection');
        $this->model->products->shouldReceive('getTotal')->once()->withNoArgs()->andReturn(25);

        $this->model->calculateValues(array('price' => 12));
        $this->assertEquals(12, $this->model->value_delivery);
        $this->assertEquals(25, $this->model->value_products);
        $this->assertEquals(37, $this->model->value_total);
    }
}

对此有什么想法吗?

【问题讨论】:

    标签: unit-testing laravel mockery


    【解决方案1】:

    我认为您的主要问题是您没有正确使用存储库模式。您应该将构造函数中传递的模型视为原型。这不是一件真实的事情,而是你用于其他事情的一个实例。在存储库中,您可能有一个 getUnpaidOrders 方法,它会执行类似return $this-&gt;model-&gt;wherePaid('0')-&gt;get(); 的操作。如您所见,我们并没有将实例作为一个实际的具体实例进行交互,而是更多地实现更广泛的范围。

    在您的计算方法中,您实际上是在此原型模型上设置值。我不知道你打算用这些做什么,但据我所知,这不是存储库模式应该做的。存储库上的方法通常是类似静态的方法,您可以在其中调用它们(可能带有一些输入)并取回一些东西。它们不应影响任何类型的内部状态,因为存储库不应具有任何类型的内部状态。

    希望这是有道理的。

    【讨论】:

    • 当然,完全有道理。谢谢你的回答。
    猜你喜欢
    • 2013-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-01
    • 2014-09-05
    相关资源
    最近更新 更多