【问题标题】:How to test dependent: :destroy with RSpec?如何使用 RSpec 测试依赖: :destroy?
【发布时间】:2015-04-09 00:17:45
【问题描述】:

我想测试我的 User 模型协会 has_many :projects, dependent: :destroy 并且目前已经走到了这一步:

it "destroys dependent projects" do
  user = FactoryGirl.build(:user)
  project = FactoryGirl.build(:project)

  user.projects << project
  user.destroy

  expect(Project.count).to change(-1)
end

但这给出了一个错误:

Failure/Error: expect(Project.count).to change(-1)
     ArgumentError:
       `change` requires either an object and message (`change(obj, :msg)`) or a block (`change { }`). You passed an object but no message.

所以我认为change 不是正确的匹配器,是吗?你能告诉我如何编写这个测试而不出现错误吗?

【问题讨论】:

    标签: ruby-on-rails ruby unit-testing testing rspec


    【解决方案1】:

    这应该可行:

    it { is_expected.to have_many(:projects).dependent(:destroy) }
    

    【讨论】:

      【解决方案2】:

      它是正确的匹配器,但你没有以正确的方式使用它:

      • 期望需要接收一个包含要执行的操作的块(在您的情况下删除用户)
      • change 需要接收一个块,该块产生预期会改变的数值(它也可以接收一个对象和一个符号,指示 rspec 应该调用命名的方法)

      正确的做法是

      expect { user.destroy }.to change { Project.count }
      

      这只是断言数值变化,但没有指定变化多少。为此,将调用链接到by

      expect { user.destroy }.to change { Project.count }.by(-1)
      

      【讨论】:

      • 你可以写 expect { user.destroy }.to change(Project, :count).by(-1) 来避免第二个块
      • 这是我一直这样做的方式。但是,我更喜欢 vanboom 的答案,因为它更明确。虽然不太可能,但如果您有一个可以通过 .by(-1) 变体但未能通过更明确的测试的错误,那么追踪它会很痛苦,从而大大提高了成本
      【解决方案3】:

      你也可以使用 shoulda 匹配器:

      it { expect(user).to have_many(:projects).dependent(:destroy) }
      

      https://github.com/thoughtbot/shoulda-matchers

      【讨论】:

      • 您应该在 spec_helper 中包含应该匹配器:require 'shoulda/matchers',有关依赖的更多信息:github.com/thoughtbot/shoulda-matchers/blob/master/lib/shoulda/…
      • 有没有其他解决方案,而不是使用 shoulda-matchers gem?
      • shoulda/matchers 需要,但还是会呕吐。
      • 当依赖项打开但未在关联匹配器中指定时,它不会报告为错误。
      【解决方案4】:

      您应该测试是否删除了实际项目。

      expect(Project.all).not_to include project
      

      【讨论】:

        【解决方案5】:

        这应该可行:

        expect { user.destroy }.to change { Project.count }.by(-1)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-12
          相关资源
          最近更新 更多