Ruby 自定义匹配器,用于;调用对象“”上的方法;

Ruby 自定义匹配器,用于;调用对象“”上的方法;,ruby,rspec,Ruby,Rspec,给出如下方法: class-MyClass def方法\u调用\u stuff 方法2(“某些值”) 结束 结束 我想定义一个期望,比如: my_object=MyClass.new 期望{my_object.method_调用{u stuff}.调用(:method2).on(my_object).with(“some value”) 我知道我可以使用rspecmocks实现同样的功能,但我也不喜欢这种语法 我该如何定义这样的匹配器(或者更好,是否有人已经编写了匹配器)?我没有看到对某个对

给出如下方法:

class-MyClass
def方法\u调用\u stuff
方法2(“某些值”)
结束
结束
我想定义一个期望,比如:

my_object=MyClass.new
期望{my_object.method_调用{u stuff}.调用(:method2).on(my_object).with(“some value”)
我知道我可以使用
rspecmocks
实现同样的功能,但我也不喜欢这种语法


我该如何定义这样的匹配器(或者更好,是否有人已经编写了匹配器)?

我没有看到对某个对象调用
method2
(是否隐式调用它?)。但我通常是这样写的:

it 'should call method2 with some value' do
  MyClass.should_receive(:method2).with("some value") 
  MyClass.method_that_calls_stuff
  # or
  # @my_object.should_receive(:method2).with("some value")
  # @my_object.method_that_calls_stuff
end

使用新语法,您可以

instance = MyClass.new
expect(instance).to receive(:method2).with("some value")
instance.method_that_calls_stuff
但是如果你真的想要那个匹配者,你可以

RSpec::Matchers.define(:call) do |method|
  match do |actual|
    expectation = expect(@obj).to receive(method)
    if @args
      expectation.with(@args)
    end
    actual.call
    true
  end

  chain(:on) do |obj|
    @obj = obj
  end

  chain(:with) do |args|
    @args = args
  end

  def supports_block_expectations?
    true
  end
end
请注意,
with
是可选的,因为您可能希望调用不带任何参数的方法


您可以获得有关如何构建自定义匹配器、流畅的接口/链接和块支持的完整信息。如果你四处浏览,你会发现如何添加漂亮的错误消息之类的东西,它们总是很方便。

是的,这也是我使用的语法。我想要一个匹配器,它可以让我在一条语句中设置期望值并调用方法。太棒了。非常感谢。