2

你好,

我正在尝试干掉我的一些规格。我提取了一个 Assertion 类,它做了几个shoulds ......但大多数 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

为什么我不能在普通的旧 ruby​​ 对象中使用 rspec 期望的语法糖?

4

2 回答 2

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。我曾使用实例方法而不是类方法

于 2014-04-09T17:24:20.083 回答
2

一种更“类似 RSpec”的方法是使用自定义匹配器

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
于 2014-04-11T02:34:51.417 回答