代码之家  ›  专栏  ›  技术社区  ›  Kamilski81

如何在为rspec测试禁用回调后重新启用它?

  •  1
  • Kamilski81  · 技术社区  · 7 年前

    我有以下代码,但我的其他测试方法失败,因为:before_save回调没有在单独的测试中触发。

     before do
          PropertyPerson.skip_callback :save, :before, :generate_match_input_names!, raise: false
        end
    
        describe :with_search_name_fuzzy do
          it 'finds the property_person' do
            property_person = property.property_people.create(person: person, match_input_search_names: ['Kamil Makski'])
    
            expect(PropertyPerson.with_search_name_fuzzy('KAM')).to be_present
    
          end
        end
    
    2 回复  |  直到 7 年前
        1
  •  3
  •   matthewd    7 年前

    skip_callback 真的不是为那种临时用途而设计的。

    一个更安全的选择是让RSpec存根您的回调方法:

    allow_any_instance_of(PropertyPerson).to receive(:generate_match_input_names!).and_return(true)
    
        2
  •  1
  •   Greg    7 年前

    我认为Rails不允许您轻松地重新启用回调。您可以重新定义调用的方法以禁用它:

    before do
      class PropertyPerson
        alias :_orig_generate_match_input_names!, :generate_match_input_names!
    
        def generate_match_input_names!
          nil
        end
      end
    end
    

    以及可重入的

    after do
      class PropertyPerson
        alias :generate_match_input_names!, :_orig_generate_match_input_names!
      end
    end
    

    很酷的事 alias 它复制了方法,而不仅仅是名称。因此,您可以使用它来恢复它的原始实现,而不必重复实现本身(如 skip_callback set_callback )