如果我无法访问或使用任何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);
}
这将无法正常工作,因为方法
addProperty
和removeProperty
中有对各种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
}
通过在诱饵类上定义
where
和latest
方法并将其设置为SUT,可以使PHPSpec知道这些方法实际上存在于类中。他们的参数和返回类型无关紧要,仅存在。优势?
现在在您的规范中,当您在模型上调用PHPSpec的
->where()
或->latest()
方法时,它不会抱怨,您可以更改诱饵类的方法以返回例如Prophecy
的对象并对其进行断言。关于php - PHPSpec和Laravel,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27489636/