我创建了一个操作 eloquent 模型的包,并为其创建了测试案例。
这个包在某些时候会调用模型的
实际数据库方法 首先我尝试了这种方法和这种方法。问题在于,在包的上下文中(即使使用
模拟方法 另一个可能的尝试(根据我的有限理解)是部分模拟模型。但是在我模拟后,它不知道如何处理其他调用,例如
方法覆盖方法 鉴于这两种可能的尝试都失败了,我默认采用了第三种可能的方法,这对我有效,但我真的不确定这是否是正确的方法。
为了避免在调用
这样,我就能够测试以下代码(完整源代码在此:链接):
所以我的问题是,这种方法可行吗?(我认为它是公平的,我没有看到异常的缺陷,但我怀疑存在更优雅的方法)。如果有建议的方法,比如模拟或使用实际的数据库运行测试,我想知道我应该对我的测试代码库进行哪些调整。
最后但很重要的一点:我不想测试模型本身,我想测试使用模型的我的代码(因此依赖于模型)。
save()
或 delete()
方法,从而尝试访问数据库。实际数据库方法 首先我尝试了这种方法和这种方法。问题在于,在包的上下文中(即使使用
orchestra/testbench
),我需要配置数据库和迁移。由于包本身没有任何模型(但我已经为测试目的创建了虚拟模型),所以我认为这种方法可能有点过度。无论如何,我仍然可以接受在内存中设置准备好的 sqlite 数据库,我也尝试过,但无法使其正常工作(它正在尝试使用forge
连接而不是sqlite
,我无法使其访问另一个连接。我可能提供一下我做的细节)。模拟方法 另一个可能的尝试(根据我的有限理解)是部分模拟模型。但是在我模拟后,它不知道如何处理其他调用,例如
fill()
,我希望它具有常见的行为,但是我收到了一个方法未找到异常。方法覆盖方法 鉴于这两种可能的尝试都失败了,我默认采用了第三种可能的方法,这对我有效,但我真的不确定这是否是正确的方法。
为了避免在调用
save()
或delete()
方法时由于缺少数据库而导致测试失败,我重写了它们(完整源代码在此处):class DummyContact extends Model
{
// ...
public function save(array $options = [])
{
$this->exists = true;
$this->wasRecentlyCreated = true;
}
public function delete()
{
$this->exists = false;
$this->wasRecentlyCreated = false;
}
}
这样,我就能够测试以下代码(完整源代码在此:链接):
public function unifyOnBase()
{
$mergeModel = $this->merge();
$this->modelA->fill($mergeModel->toArray());
$this->modelA->save();
$this->modelB->delete();
return $this->modelA;
}
所以我的问题是,这种方法可行吗?(我认为它是公平的,我没有看到异常的缺陷,但我怀疑存在更优雅的方法)。如果有建议的方法,比如模拟或使用实际的数据库运行测试,我想知道我应该对我的测试代码库进行哪些调整。
最后但很重要的一点:我不想测试模型本身,我想测试使用模型的我的代码(因此依赖于模型)。