2009-04-22 10 views
1

私は、私の会社が作成するソフトウェアのテストフレームワークに取り組んでいます。当社の製品はウェブベースであり、RESTfulなリクエストを実行した後、結果を処理したいと考えています。私は、各コマンドクラスでactiverecord型バリデーションを持つことができるようにして、実行後に結果をすべての「バリデーション」に対して自動的にテストするようにします。しかし、私はこれを行う方法がわかりません。私のコードはこのように見えます(重要な部分を示すために簡略化されています)。activerecordの外でactiverecordスタイル検証を作成するには?

class CodesecureCommand 
    def execute 
    result = RestClient.post("http://#{codesecure.host_name_port}#{path}", post_data) 

    return parse(result) #parse simple returns a Hpricot document 
    end 
end 

class RunScan < CodesecureCommand 

    #What I have now 
    #I have to override the execute function so that it calls the local success method 
    #to see if it failed or not. 
    def execute() 
    result = super() 

    if success(result) 
     return true 
    else 
    end 

    end 

    def success(result) 
    result.search('div.transaction-message') do |message| 
     if message.innerHTML.scan(/Configure abuse setting for domain users successfully\./).length == 1 
     return true 
     end 
    end 
    end 



    #What I would like is to be able to call execute (without having to override it). 
    #then after it runs it calls back to this class to check 

    #if the regex matches the command was successful and returns true 
    test_success /regex/ 

    #if test_success fails then these are called 
    #the idea being that I can use the regex to identify errors that happened then 
    #report them to the user 
    identify_error /regex/, "message" 
    identify_error /regex/, "message" 
    end 
end 

は、私が欲しいのはexecuteメソッドが呼び出された後test_successとidentify_errorは自動的にActiveRecordの中のバリデーションのように呼ばれているということです。誰も私にこれをする方法を教えてもらえますか?あなたのコードではあまり見なくても、感謝

答えて

3

は、ここでのバリデーションクラスのメソッドを実装する上で、私のテイクがあります:

module Validations 
    def self.included(base) 
    base.extend ClassMethods 
    end 

    def validate 
    errors.clear 
    self.class.validations.each {|validation| validation.call(self) } 
    end 

    def valid? 
    validate 
    errors.blank? 
    end 

    def errors 
    @errors ||= {} 
    end 

    module ClassMethods 
    def validations 
     @validations ||= [] 
    end 

    def validates_presence_of(*attributes) 
     validates_attributes(*attributes) do |instance, attribute, value, options| 
     instance.errors[attribute] = "cant't be blank" if value.blank? 
     end 
    end 

    def validates_format_of(*attributes) 
     validates_attributes(*attributes) do |instance, attribute, value, options| 
     instance.errors[attribute] = "is invalid" unless value =~ options[:with] 
     end 
    end 

    def validates_attributes(*attributes, &proc) 
     options = attributes.extract_options! 

     validations << Proc.new { |instance| 
     attributes.each {|attribute| 
      proc.call(instance, attribute, instance.__send__(attribute), options) 
     } 
     } 
    end 
    end 
end 

それはそれはRailsの環境である、activesupportの周りであることを前提としています。属性ごとに複数のエラー(instance.errors[attribute] << "the message")を許可するように拡張することもできますが、この短いサンプルをできるだけシンプルに保つために、あたかもあいまいさを省いています。ここで

が短い使用例です:

class MyClass 
    include Validations 

    attr_accessor :foo 
    validates_presence_of :foo 
    validates_format_of :foo, :with => /^[a-z]+$/ 
end 

a = MyClass.new 
puts a.valid? 
# => false 

a.foo = "letters" 
puts a.valid? 
# => true 

a.foo = "Oh crap$(!)*#" 
puts a.valid? 
# => false 
+0

お返事ありがとうございます。私が感謝のために探しているものです。 1つの質問、それにはActiveSupportが必要ですか?ありがとう。 –

+0

( 'valid?'メソッドで) 'Hash#blank? 'を使います。しかしそれはそれについてです、ちょっと。 active_supportを削除するのは難しいことではありません。私はちょうどそれがすでにそこにあると仮定しました。 –

+0

Array#extract_options!も使用しますが、複製/抽出するのには簡単です。 –

2

あなたはValidatableたい:sudo gem install validatable

class Person 
    include Validatable 
    validates_presence_of :name 
    attr_accessor :name 
end 

をまた、Validatableはactivesupportの上の依存関係を持っていません。

+0

私はこの答えが好きです。ドライヤーが多く、依存度が低い –

関連する問題