Rails rspec after_save引用自我

时间:2013-09-26 01:16:44

标签: ruby-on-rails ruby rspec

我想在我的网站上添加亵渎性检查。

我采用的是TD方法,我正在尝试以下方法:

  1. 检查特定个人资料字段中是否存在亵渎性
  2. 创建一个标志
  3. 如果不存在,则创建一个标志
  4. 创建一个标志(如果存在,但已被解雇)
  5. 到目前为止,这是我的规范:

    describe Painter do
      before do
        @painter = FactoryGirl.create(:painter_flag)
      end
    
      context "blacklist flag" do
        it "check if profanity exists" do
          @painter.experience = "test"
          @painter.save
          expect {@painter.blacklist_flags?}.to be_true
        end
        it "create flag if profanity exists" do
          @painter.experience = "test"
          @painter.save
          BlacklistFlag.count.should be > 0
        end
      end
    end
    

    与画家相关的代码:

    after_save :create_flag, if: :blacklist_flags?
    
    def blacklist_flags?
        list = ""
        list << skills
        #list << experience
        #list << first_name
        #list << last_name
        #list.downcase.scan(/(badword|badword)/).size > 0
      end
    
    def create_flag
    end
    

    如果我在两个测试通过上方注释掉以下代码:

     list << skills
    

    当我离开代码时,我收到以下错误:

    2)如果亵渎存在,画家黑名单标志会创建标志      失败/错误:@painter = FactoryGirl.create(:painter_flag)      类型错误:        无法将nil转换为字符串

    似乎引用自我存在问题,因为技能,经验等是模型的一部分。我不知道如何解决这个问题。请指教。

    更新

    FactoryGirl.define do
      factory :painter do
        first_name "Brian"
        last_name  "Rosedale"
        state "OH"
        zip_code "43081"
        sequence(:email) {|n| "nobody#{n}@painterprofessions.com" }
        phone "12345566"
        pdca_member false
        password "123456"
        factory :painter_flag do
           skills = "badword"
        end
      end
    end
    

2 个答案:

答案 0 :(得分:0)

我认为造成错误的原因是因为回调已在@painter = FactoryGirl.create(:painter_flag)行执行。

如果要测试回调,可能需要使用FactoryGirl.build方法。

答案 1 :(得分:0)

只需在工厂中使用此行:painter_flag,而不使用=符号。

skills "badword"