【问题标题】:During testing in Rails 3, updating a record causes related records to be deleted在 Rails 3 中测试期间,更新记录会导致相关记录被删除
【发布时间】:2014-03-12 05:59:19
【问题描述】:

我正在使用 Rails 3 中的 minitest 运行一些测试。我有一个需求模型和一个 ind_requirements 模型,它充当行业模型和需求模型之间的交集。我在需求模型的 has_many 上设置了一个依赖 :destroy,但删除它似乎对我所看到的没有任何影响。

这是所有控制器测试,所以我没有与 UI 交互,否则我会怀疑这里报告的内容:Active record update_attribute executes a DELETE query on an associated object(child) of an object(parent) when parent is updated

当@requirement.update_attributes 被命中时,我在日志中得到以下输出:

Processing by RequirementsController#update as HTML
Parameters: {"requirement"=>{"reqText"=>"second version", "reqTitle"=>"Second Version"}, "id"=>"1"}
User Load (0.1ms)  SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1  [["id", 1]]
SQL (0.1ms)  SELECT "requirements"."id" AS t0_r0, "requirements"."reqTitle" AS t0_r1, "requirements"."reqText" AS t0_r2, "requirements"."created_at" AS t0_r3, "requirements"."updated_at" AS t0_r4, "requirements"."category_id" AS t0_r5, "requirements"."status" AS t0_r6, "requirements"."source_id" AS t0_r7, "requirements"."sortOrder" AS t0_r8, "requirements"."version" AS t0_r9, "requirements"."active" AS t0_r10, "categories"."id" AS t1_r0, "categories"."catName" AS t1_r1, "categories"."created_at" AS t1_r2, "categories"."updated_at" AS t1_r3, "categories"."catAbbr" AS t1_r4 FROM "requirements" LEFT OUTER JOIN "categories" ON "categories"."id" = "requirements"."category_id" WHERE "requirements"."active" = 't' AND "requirements"."id" = ? ORDER BY categories.catName LIMIT 1  [["id", "1"]]
 (0.2ms)  SELECT COUNT(*) FROM "roles" INNER JOIN "role_assignments" ON "roles"."id" = "role_assignments"."role_id" WHERE "role_assignments"."user_id" = 1 AND (roleName = 'Editor')
 (0.2ms)  SELECT COUNT(*) FROM "roles" INNER JOIN "role_assignments" ON "roles"."id" = "role_assignments"."role_id" WHERE "role_assignments"."user_id" = 1 AND (roleName = 'Administrator')
 (0.2ms)  SAVEPOINT active_record_1
 Industry Load (0.2ms)  SELECT "industries".* FROM "industries" INNER JOIN "ind_requirements" ON "industries"."id" = "ind_requirements"."industry_id" WHERE "ind_requirements"."requirement_id" = 1 ORDER BY indName
SQL (0.2ms)  DELETE FROM "ind_requirements" WHERE "ind_requirements"."requirement_id" = 1 AND "ind_requirements"."industry_id" = 2
SQL (0.5ms)  INSERT INTO "requirement_versions" ("category_id", "created_at", "reqText", "reqTitle", "req_id", "status", "updated_at", "version") VALUES (?, ?, ?, ?, ?, ?, ?, ?)  [["category_id", nil], ["created_at", Wed, 12 Mar 2014 06:00:13 UTC +00:00], ["reqText", "This is a test general requirement for the purpose of, um, testing things"], ["reqTitle", "Test Requirement 19"], ["req_id", 1], ["status", "Public"], ["updated_at", Wed, 12 Mar 2014 06:00:13 UTC +00:00], ["version", 1]]
 (0.1ms)  UPDATE "requirements" SET "reqText" = 'second version', "reqTitle" = 'Second Version', "version" = 2, "updated_at" = '2014-03-12 06:00:13.418730' WHERE "requirements"."id" = 1
 (0.1ms)  RELEASE SAVEPOINT active_record_1

注意删除。这会破坏我的测试,因为一旦从测试数据库中删除这些记录,我的后续代码将无法正常工作。在开发中运行时不会触发此删除,只是在测试中。

我缺少配置选项吗?

这是 requirements.rb 文件(不包括不属于此的所有其他方法):

class Requirement < ActiveRecord::Base

has_many :ind_requirements, dependent: :destroy
has_many :requirement_versions
has_many :industries, through: :ind_requirements
has_many :responses
belongs_to :category
scope :active, where(:active => true)
default_scope active.includes(:category).order('categories.catName')
scope :submitted, where(:status => :Submitted)
scope :public, where(:status => :Public)

accepts_nested_attributes_for :requirement_versions

attr_accessible :reqText, :reqTitle, :industry_ids, :category_id, :catName, :status, :user_id, :source_id, :catAbbr, :reqNumber, :sortOrder, :requirement_versions_attributes

这是实际的测试用例:

test "When a requirement is reverted, the previous associated industry list is restored" do
login_admin
@requirement = create(:requirement)

@industry = create(:industry, indName: "First Industry")
@indLink = create(:ind_requirement, requirement_id: @requirement.id)

@indLink.save!

put :update, id: @requirement, requirement: { reqText: "second version", reqTitle: "Second Version"}

@industry = create(:industry, indName: "Second Industry")

@indLink.industry_id = @industry.id

@indLink.save!

get :revert, id: @requirement

@requirement = Requirement.find(@requirement.id)

@indLink = @requirement.ind_requirements.first

assert_equal(@indLink.industry.indName, "First Industry")


 end

【问题讨论】:

  • 您能分享一下您为运行此测试而编写的测试用例吗?
  • 另外,我没有看到在这种情况下运行的更新查询应该更新需求
  • 我将测试用例添加到问题中。我明白你对更新查询的意思。奇怪的是我也没有看到它,即使系统声称它正在运行更新。当我在调试时,你可以看到对记录的修改,但它似乎没有写回数据库?
  • 我还扩展了 SQL 以包含实际的更新查询。

标签: ruby-on-rails minitest


【解决方案1】:

问题是当我发送更新到需求时,我只发送更新的参数:put :update, id: @requirement, requirements: { reqText: "second version", reqTitle: "Second Version" },但不包括复选框的参数,因为我没有修改它们。不幸的是,最终结果是这些行业随后被删除。我想是因为参数的缺失不是解释为它们没有被更新,而是它们已被删除。

【讨论】:

    猜你喜欢
    • 2011-10-28
    • 1970-01-01
    • 2016-05-17
    • 1970-01-01
    • 2017-09-23
    • 2017-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多