如何在PORO中使用RSpec Expectations

时间:2014-04-09 10:28:19

标签: ruby rspec rspec-expectations

您好,

我试图干掉我的一些规格。我提取了一个Assertion类,它执行了几个should ...但是大部分RSpec期望魔法都不再有用了。

我将尝试构建一个简单的示例,以显示我的问题。

被测对象:

class Foo
  def has_bar?; true; end
end

我的断言课程:

class MyAssertions
  def self.assert_everything_is_ok
    @foo = Foo.new
    @foo.has_bar?.should == true  # works!
    @foo.has_bar?.should be_true  # undefined local variable or method `be_true`
    @foo.should have_bar          # undefined local variable or method `have_bar`
  end
end

我的规格:

it "tests something" do
  @foo = Foo.new
  @foo.should have_bar                # works!
  MyAssertion.assert_everything_is_ok # does not work, because of errors above
end

为什么我不能在我的普通老红宝石对象中使用rspec期望的语法糖?

2 个答案:

答案 0 :(得分:2)

经过一番尝试,我想出了这个解决方案:

class MyAssertions
  include RSpec::Matchers

  def assert_everything_is_ok
    @foo = Foo.new
    @foo.has_bar?.should == true  # works!
    @foo.has_bar?.should be_true  # works now :)
    @foo.should have_bar          # works now :)
  end
end

诀窍是include RSpec::Matchers模块。我使用了实例方法而不是类方法

答案 1 :(得分:2)

更多'类似RSpec'的方法是使用custom matcher

RSpec::Matchers.define :act_like_a_good_foo do
  match do
    # subject is implicit in example
    subject.has_bar?.should == true
    subject.should be_true  # predicate matchers defined within RSpec::Matchers
    subject.should have_bar
  end
end

describe Foo do
  it { should act_like_a_good_foo }
end