Ruby on rails Rails数据库更改不是';不要坚持通过测试

Ruby on rails Rails数据库更改不是';不要坚持通过测试,ruby-on-rails,ruby,unit-testing,testing,Ruby On Rails,Ruby,Unit Testing,Testing,我正在为我当前的rails项目编写测试,并且遇到了一个问题,即通过post调用对测试数据库所做的更改没有持续足够长的时间来测试这些更改 基本上,我有一个条形码分配给他们的对象。我已经提出了一个表单,用户可以扫描几个条形码,一次更改多个对象。这是代码 objecta_controller.rb: def change_many @barcodes = params[:barcodes].split() @objects = ObjectA.order("barcode").wh

我正在为我当前的rails项目编写测试,并且遇到了一个问题,即通过post调用对测试数据库所做的更改没有持续足够长的时间来测试这些更改

基本上,我有一个条形码分配给他们的对象。我已经提出了一个表单,用户可以扫描几个条形码,一次更改多个对象。这是代码

objecta_controller.rb:

  def change_many
    @barcodes = params[:barcodes].split()
    @objects = ObjectA.order("barcode").where(barcode: @barcodes)
    @objects.each do |b|
      if can? :change, b
        b.state_b()
      end
    end
  end
(注意:@条形码是由空格分隔的一组条形码)

objecta_controller_test.rb:

test "change object" do
    sign_in_as(:admin_staff)

    b = ObjectA.new(
      barcode: "PL123456",
      current_status: "state_a")
    post :change_many, { barcodes: b.barcode }

    assert_equal("state_b", b.current_status, "Current status incorrect: #{b.to_s}")
  end

使用byebug,我已经确定对象在change\u many方法中确实改变了状态,但是一旦它返回到测试,对象的状态就会恢复到原来的状态,并且测试失败。

首先,您持有的是一个内存中的对象,尚未保存到数据库中,因此首先:

  • 在发布之前添加b.save
其次,内存中对象不会自动反映数据库中的更改。您必须告诉它刷新其状态,因此:

  • 在断言之前添加b.reload

在调用
assert_equal
之前尝试重新加载
b.reload