【问题标题】:How to build chained methods like - should_receive(:something).with(:params, values).and_return(:something_else)如何构建链式方法,例如 - should_receive(:something).with(:params, values).and_return(:something_else)
【发布时间】:2011-06-02 17:47:31
【问题描述】:

我试图让我的代码更小一些,构建一个看起来像 RSpec 中的 should_receive 的方法,这里的情况是我正在测试一个状态机,并且我有几个方法的代码如下:

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')

这些方法是如何构建的?

【问题讨论】:

    标签: ruby-on-rails ruby rspec rspec-rails


    【解决方案1】:

    简单:

    类对象 def should_receive(味精) self.send(msg.to_sym) 自己 结尾 def and_transition_to(状态) @state == 状态 结尾 定义添加 @state = '添加' 结尾 结尾

    现在你可以运行了:

    obj = Obj.new obj.should_receive(:add).and_transition_to('adding') => 真

    【讨论】:

      【解决方案2】:

      链接的重要部分是从对象返回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
      

      【讨论】:

        【解决方案3】:

        这不是 ruby​​-on-rails,而是 this article 给出了 Fluent 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;
            }
            :
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-08-24
          • 2013-06-19
          • 1970-01-01
          • 2013-05-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多