RSpec'指定'使用显式主语传递,但不包含隐式主语

时间:2012-12-27 19:28:51

标签: ruby rspec

我以为我理解隐含主题在RSpec中如何运作,但我不知道。

为什么在下面的示例中,第一个带有显式主题的规范通过,但使用隐式主题的第二个规范失败,并且“未定义方法`匹配'用于#”:

class Example
  def matches(str) ; true ; end
end

describe Example do
  subject { Example.new }
  specify { subject.matches('bar').should be_true }
  it { matches('bar').should be_true }
end

(我正在使用rspec 1.3,但我在2.10.1中验证了相同的行为。)

3 个答案:

答案 0 :(得分:2)

回到一些基本的ruby:你基本上是在调用self.matches,在这种情况下self是一个RSpec示例。

您可以在此示例中使用参数调用“应该”之类的内容,因此您可以尝试使用以下内容:

it { should matches('bar') }

但这会失败;自我还没有方法matches

在这种情况下,主题实际上是matches方法,而不是Example实例。因此,如果您想继续使用隐式主题,您的测试可能类似于:

class Example
  def matches(str) ; str == "bar" ; end
end

describe Example do
  describe "#matches" do
    let(:method) { Example.new.method(:matches) }

    context "when passed a valid value" do
      subject { method.call("bar") }
      it { should be_true }
    end

    context "when passed an invalid value" do
      subject { method.call("foo") }
      it { should be_false }
    end
  end
end

答案 1 :(得分:0)

我认为你不能调用隐含主题的任何方法。您不需要指定主题的隐含主题含义,但如果您想要调用任何方法,您需要指定主题。

答案 2 :(得分:0)

虽然克里斯提供了非常好的答案,但我建议你看一下这篇博文:http://blog.davidchelimsky.net/2012/05/13/spec-smell-explicit-use-of-subject/