Is it possible for RSpec to expect change in two tables?

后端 未结 8 1564
借酒劲吻你
借酒劲吻你 2020-12-09 07:15

RSpec expect change:

it \"should increment the count\" do
  expect{Foo.bar}.to change{Counter.count}.by 1
end

Is there a way to expect chan

8条回答
  •  谎友^
    谎友^ (楼主)
    2020-12-09 08:05

    After none of the proposed solutions proved to actually work, I accomplished this by adding a change_multiple matcher. This will only work for RSpec 3, and not 2.*

    module RSpec
      module Matchers
        def change_multiple(receiver=nil, message=nil, &block)
          BuiltIn::ChangeMultiple.new(receiver, message, &block)
        end
        alias_matcher :a_block_changing_multiple,  :change_multiple
        alias_matcher :changing_multiple,          :change_multiple
    
        module BuiltIn
          class ChangeMultiple < Change
            private
    
              def initialize(receiver=nil, message=nil, &block)
                @change_details = ChangeMultipleDetails.new(receiver, message, &block)
              end
          end
          class ChangeMultipleDetails < ChangeDetails
            def actual_delta
              @actual_after = [@actual_after].flatten
              @actual_before = [@actual_before].flatten
              @actual_after.map.with_index{|v, i| v - @actual_before[i]}
            end
          end
        end
      end
    end
    

    example of usage:

    it "expects multiple changes despite hordes of cargo cultists chanting aphorisms" do
      a = "." * 4
      b = "." * 10
      times_called = 0
      expect {
        times_called += 1
        a += ".."
        b += "-----"
      }.to change_multiple{[a.length, b.length]}.by([2,5])
      expect(times_called).to eq(1)
    end
    

    Making by_at_least and by_at_most work for change_multiple would require some additional work.

提交回复
热议问题