5

我有一个模型“SoftwareVersion”的夹具:

testing:
  id: 4
  version: "4.0"
  file_name: MyString4
  is_testing: true

以及模型的默认范围:

 default_scope where(is_testing: false)

如果我在测试中这样做:

software_versions(:testing)

我收到一个错误:

ActiveRecord::RecordNotFound: Couldn't find SoftwareVersion with id=4 [WHERE `software_versions`.`is_testing` = 0]

这是预期的行为吗?以及如何覆盖它?

4

2 回答 2

3

是的,这是预期的行为,默认范围将影响所有查询。使用 unscoped 再次开始一个干净的查询:

SoftwareVersion.unscoped.where(is_testing: true)
SoftwareVersion.unscoped.find(id: 4)
etc.

但除此之外,如果您使用同一张表(带有夹具)来存储生产和测试记录,那么您做错了。Rails 使用完全不同的数据库进行测试,因此不需要列来区分。而且,如果您将固定装置放在 下test/fixtures,它们将永远不会在生产中加载。

于 2014-11-11T15:09:07.403 回答
2

行为符合预期,唯一的问题是在您的测试数据库中,没有 SoftwareVersion 的记录。您只需要在运行测试之前填充数据库。如您所见,查询已完美完成,WHERE software_versions.is_testing = 0,与false您的default_scope.

于 2013-07-29T12:32:09.397 回答