1

我以为我了解隐式主题在 RSpec 中的工作原理,但我不明白。

为什么在以下示例中,具有显式主题的第一个规范通过,但使用隐式主题的第二个规范失败,并出现“未定义的方法 `matches' for #”:

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 验证了相同的行为。)

4

3 回答 3

2

回到一些基本的 ruby​​:你基本上是在调用self.matchesself在本例中是一个 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
于 2012-12-27T19:48:55.967 回答
0

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

于 2012-12-27T19:42:51.020 回答
0

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

于 2012-12-27T19:54:38.150 回答