如果我无法访问或使用任何Eloquent方法,那么使用PHPSpec有什么意义?

例如:($ this代表Eloquent Product模型)

function it_removes_property(PropertyValueInterface $property)
{
    $this->addProperty($property);
    $this->properties->shouldHaveCount(1);

    $this->removeProperty($property);
    $this->properties->shouldHaveCount(0);
}


这将无法正常工作,因为方法addPropertyremoveProperty中有对各种Eloquent Collection和Model函数的调用,即使所有这些类都包含在use语句中,PHPSpec似乎也无法处理。

我在Jeffery Way在Laracasts上的屏幕投射中注意到,他从未使用过真正的口才模型。他只使用普通的PHP对象。有什么意义呢?那不是现实世界。

同样,这与正确引用雄辩的模型类无关,因为我已经在执行此use Illuminate\Database\Eloquent\Model;

我也从来没有使用过外墙。所以也不是。

最佳答案

PHPSpec无法执行很多工作,例如,使用PHPUnit和Mockery可以做。
底线:我想说PHPSpec不是测试Eloquent的正确工具。

Eloquent内部发生了很多“魔术”,PHPSpec似乎并不喜欢魔术,如果您觉得必须使用PHPSpec来测试Eloquent,否则整个世界都会崩溃,那么您可以做一些事情。

免责声明:我不鼓励您继续使用PHPSpec进行口才测试,实际上我不希望您使用它来测试口才模型,我只是在解释一些魔术技巧,以解决在测试魔术方法时遇到的情况和妖术-希望您可以在合理的情况下将其应用到其他地方。对我而言,对于雄辩的模型而言,这没有任何意义。

所以这是列表:


不要使用魔术的吸气剂和吸气剂,而要使用getAttribute()setAttribute()
不要使用魔术调用来延迟加载关系,即$user->profile。使用方法$user->profile()->getResults()
创建一个扩展模型的SUT模拟类,并在其上定义这些where方法,还定义范围方法以及Eloquent应该“神奇地”为您做的所有其他事情。
使用beAnInstanceOf()方法切换到模拟并对其进行断言。


这是测试示例的示例:

产品型号

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    public function scopeLatest($query)
    {
        return $query->where('created_at', '>', new Carbon('-1 week'))
            ->latest();
    }

    // Model relations here...
}


产品型号规格

<?php namespace Spec\Model;

use Prophecy\Argument;
use App\Entities\Product;
use PhpSpec\ObjectBehavior;

class ProductSpec extends ObjectBehavior
{
    public function let()
    {
        $this->beAnInstanceOf(DecoyProduct::class);
    }

    public function it_is_initializable()
    {
        $this->shouldHaveType('Product');
    }
}

// Decoy Product to run tests on
class DecoyProduct extends Product
{
    public function where();

    // Assuming the Product model has a scope method
    // 'scopeLatest' on it that'd translate to 'latest()'
    public function latest();

    // add other methods similarly
}


通过在诱饵类上定义wherelatest方法并将其设置为SUT,可以使PHPSpec知道这些方法实际上存在于类中。他们的参数和返回类型无关紧要,仅存在。

优势?
现在在您的规范中,当您在模型上调用PHPSpec的->where()->latest()方法时,它不会抱怨,您可以更改诱饵类的方法以返回例如Prophecy的对象并对其进行断言。

关于php - PHPSpec和Laravel,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27489636/

10-13 02:05