4

私はこのようなものを持っています:

class Something
  def some_method
    %x{xyz}
  end
end

そしてスペックでは:

describe Something do
  describe "#some_method" do
    it "should execute xyz command in a subshell" do
      x = Something.new
      #What should come here?
      x.some_method
    end
  end
end

「システム」をモックする方法を知っています。しかし、私の質問は「%x」に固有のものです。では、%xをモックする方法は?

4

3 に答える 3

4

あなたが探しているラインは

x.should_receive(:`).once.with('xyz')

バックティックは実際には呼び出されるメソッドであり、バックティックの間に置かれるものはすべてString引数として渡されます。%x{...}はバックティックの構文上のバリエーションであるため、同じメソッド呼び出しが発生します。

于 2012-10-24T20:21:15.260 に答える
2

これを行うと%x{xyz}、これは、文字列引数「xyz」を使用して呼び出されたカーネル上のメソッド(メソッド名は文字通り単一のバッククォート文字)を`xyz`呼び出すためのシンタックスシュガーであることが判明したのと同じです。`

Ruby構文ではこの名前のメソッドを定義できないため、次のようにするdefine_method代わりに使用する必要があります。def

module Kernel
  define_method(:"`") do |x|
    x + "blah"
  end
end

そして今`xyz`%x{xyz}この新しいメソッドを呼び出します:

%x{xyz} #=> "xyzblah"
`foobar` #=> "foobarblah"
于 2012-10-24T17:27:23.090 に答える
0

スコットオルソンのコメントに基づいて、%xはただKernel#`のことなので、これは私にとってはうまくいきます:

  x = Something.new
  expect(x).to receive(:`).with(xyz)
  x.some_method
于 2019-01-23T23:02:03.383 に答える