RSpec "指定"带有显式主语的传递,但不使用隐式主语

  • 本文关键字:主语 指定 RSpec ruby rspec
  • 更新时间 :
  • 英文 :


我以为我理解了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/

相关内容

  • 没有找到相关文章

最新更新