我以为我理解了RSpec中的隐式主题是如何工作的,但是我没有。
为什么在下面的例子中,第一个带有显式主题的规范通过了,但是第二个带有隐式主题的规范失败了,出现了"undefined method ' 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中验证了相同的行为)
回到一些基本的ruby:您基本上调用self.matches
,而self
在这种情况下是一个RSpec示例。
在这个例子中,你可以用参数调用像"should"这样的东西,所以你可以尝试这样做:
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
我认为你不能调用任何隐式主体的方法。隐含的主题含义你不需要指定主题,但是如果你想调用任何方法,你需要指定主题。
尽管Chris给出了很好的答案,我还是建议你看看这篇博文:http://blog.davidchelimsky.net/2012/05/13/spec-smell-explicit-use-of-subject/