rspec`his`语法与动态条件

bra*_*rad 20 ruby scope rspec2

我一直非常喜欢使用contexts,subjectsits使用rspec来真正清理我的测试代码.典型例子:

context "as a user" do
  subject{ Factory :user }

  its(:name){ should == "Bob" }
end
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚的是我如何使这个条件动态(即基于其他对象). its似乎实例eval了块内的属性,所以我无法访问它周围的一切.我喜欢做类似的事情:

its(:name){ should == subject.contact.name }
Run Code Online (Sandbox Code Playgroud)

但我看不出任何实现这一目标的方法.有没有人知道是否有一个方法代理到这个实例eval,它提供了对原始对象的访问?或者,如果有任何其他方式,我可以使用我正在检查的属性实例范围之外的方法?

附加信息

似乎subjectits块中变为实际属性(name在这种情况下)

有趣的是,我可以访问我的任何let方法,但同样,我无法访问我原来subject的问题.

Dav*_*vid 29

您几乎在回答自己,let在设置主题之前使用作业.然后你可以随处参考:

context "as a user" do
  let(:user) { Factory(:user) }
  subject { user }
  its(:name) { should == user.contact.name }
end
Run Code Online (Sandbox Code Playgroud)

我是context,subject,its情人呢!

  • rspec现在支持`subject(:user){user}`所以可以删除`let(:user)..`声明 (12认同)
  • @David抱歉,实际上鼓励在SO上进行编辑.http://stackoverflow.com/privileges/edit (4认同)