您好,
我试图干掉我的一些规格。我提取了一个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期望的语法糖?
答案 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