2011-06-02 2 views
0

RSpecからshould_receiveのように見えるメソッドを構築するためにコードを少し小さくしようとしていました。 、場合は、ここで私は、ステートマシンをテストしていると私はこのようなコードで、いくつかの方法があるということです。- should_receive(:something).with(:params、values).and_return(:something_else)のようなチェーンメソッドを構築する方法

context "State is unknown" do 
    before do 
    @obj = create_obj(:state => 'unknown') 
    end 
    context "Event add" do 
    it 'should transition to adding if not in DB' do 
     @obj.add 
     @obj.state.should == 'adding' 
    end 

    it 'should transition to linking if already in DB' do 
     create_obj_in_db 
     @obj.add 
     @obj.state.should == 'linking' 
    end 
    end 
end 

私はこれに似たものにこれらのコード行を置き換えたい:

@obj.should_receive(:add).and_transition_to('adding') 
@obj.should_receive(:modify).and_transition_to('modifying') 

これらのメソッドはどのように構築されていますか?

答えて

0

チェーンへの重要な部分は、オブジェクトからselfを返すことですので、次の呼び出しは、まだ上で動作することができますオブジェクト。

class Foo 
    def one 
    puts "one" 
    self 
    end 

    def two 
    puts "two" 
    self 
    end 

    def three 
    puts "three" 
    self 
    end 
end 

a=Foo.new 
a.one.two.three 
0

ルビーオンレールではありませんが、this articleFluent Interfaceの例です。

public class Pipeline 
{ 
    private Image image; 
    public Image CurrentImage 
    { 
     get { return image; } 
     set { image = value; } 
    } 

    public Pipeline(string inputFilename) 
    { 
     image = Bitmap.FromFile(inputFilename); 
    } 

    public Pipeline Rotate(float Degrees) 
    { 
     RotateFilter filter = new RotateFilter(); 
     filter.RotateDegrees = Degrees; 
     image = filter.ExecuteFilter(image); 
     return this; 
    } 
    : 
2

シンプル:

 
class Obj 
    def should_receive(msg) 
    self.send(msg.to_sym) 
    self 
    end 
    def and_transition_to(state) 
    @state == state 
    end 
    def add 
    @state = 'adding' 
    end 
end 

あなたが実行することができます:

 
obj = Obj.new 
obj.should_receive(:add).and_transition_to('adding') 
=> true 
関連する問題