Rspec:|| =运算符重复计算代码

时间:2017-06-26 19:40:44

标签: ruby-on-rails ruby rspec

我正在使用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运算符仅在第一次评估变量的代码。为什么我的代码会再次评估?

2 个答案:

答案 0 :(得分:4)

安德里说的是真的; @all_users中保存的值不仅仅是数组或列表,而是ActiveRecord关系。当您调用all_users.count时,它将进行数据库查询以确定结果。

答案 1 :(得分:3)

我怀疑User.all_users是范围或类方法,它可以执行类似where(status: 'active')的操作。

在这种情况下,User.all_users不返回模型集合,而是返回一个懒惰的SQL查询。当您编写User.status_active时,您实际上会创建一个新的SQL查询并获取实际数据