我正在使用rspec进行测试。我有这段代码:
$repository = $em->getRepository(Product::class);
然后我有以下两个期望:
/**
* Get product repo
*
* @return ProductRepository
*/
public function getProductRepository()
{
return $this->getEntityManager()->getRepository(Product::class);
}
/**
* @return \Doctrine\ORM\EntityManager
*/
public function getEntityManager(): EntityManager
{
return $this->getDoctrine()->getManager();
}
他们都返回class Service
def execute
all_users.update_all(status: 'deactive')
end
def all_users
@all_users ||= User.status_active
end
end
。这意味着我第一次调用expect(service.all_users.count).to eq 10
service.execute
expect(service.all_users.count).to eq 0
时,会对其进行一次评估。在第二次调用时,再次评估true
,这次是因为我已将所有用户的状态更改为all_users
,并且活动用户总数为零。
all_users
运算符仅在第一次评估变量的代码。为什么我的代码会再次评估?
答案 0 :(得分:4)
安德里说的是真的; @all_users
中保存的值不仅仅是数组或列表,而是ActiveRecord
关系。当您调用all_users.count
时,它将进行数据库查询以确定结果。
答案 1 :(得分:3)
我怀疑User.all_users
是范围或类方法,它可以执行类似where(status: 'active')
的操作。
在这种情况下,User.all_users
不返回模型集合,而是返回一个懒惰的SQL查询。当您编写User.status_active
时,您实际上会创建一个新的SQL查询并获取实际数据