我以为我理解隐含主题在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中验证了相同的行为。)
答案 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/