【发布时间】:2011-12-09 13:21:36
【问题描述】:
我一直非常喜欢使用带有 rspec 的 contexts、subjects 和 its 来真正清理我的测试代码。典型例子:
context "as a user" do
subject{ Factory :user }
its(:name){ should == "Bob" }
end
但我想不通的是如何使这个条件动态化(即基于其他对象)。 its 似乎对块内的属性进行了实例化,因此我无法访问它周围的所有内容。我想做这样的事情:
its(:name){ should == subject.contact.name }
但我看不到任何实现这一目标的方法。有谁知道是否有一些通过此实例 eval 代理的方法可以访问原始对象?或者如果有任何其他方式我可以使用我正在检查的属性实例范围之外的方法?
附加信息
似乎its 块中的subject 更改为实际属性(在这种情况下为name)
有趣的是,我可以访问我的任何 let 方法,但同样,我无法访问有问题的原始 subject。
【问题讨论】:
-
您能重新表述一下您的问题吗?听起来您正在做一些有趣的事情,但是您的示例很糟糕,因为您正在尝试测试内部实现而不是外部行为。
-
我的问题与这个特定的实现无关。相反,我想在我的
its块中引用我的user设置作为主题,但经过一些探索后,its中的主题现在变成了属性(在这种情况下为name) -
请注意,这可能不是一个好主意,因为它不会在您的规范报告中为您提供有意义的描述:您将在报告中看到
should == "Bob",而您真正想要的看到是should equal the contact's name- 我知道its语法无法做到这一点。我喜欢its,但由于这个限制,我只用它来匹配常量。