0

我正在关注 Michael Hartl 的精彩 Rails 教程,但我想知道是否有办法在我的用户规范中重构它。这是非常重复的,想知道是否有办法让它变干一点。

it { should respond_to(:name) }
it { should respond_to(:email) }
it { should respond_to(:password_digest) }
it { should respond_to(:password) }
it { should respond_to(:password_confirmation) }
it { should respond_to(:remember_token) }
it { should respond_to(:authenticate) }
it { should respond_to(:admin) }
it { should respond_to(:authenticate) }
it { should respond_to(:microposts) }
it { should respond_to(:feed) }
it { should respond_to(:relationships) }
it { should respond_to(:followed_users) }
it { should respond_to(:following?) }
it { should respond_to(:follow!) }
it { should respond_to(:followers) }
it { should respond_to(:reverse_relationships) }
4

2 回答 2

4
[:name, 
 :email, 
 ...
].each do |attrib|
  it { should respond_to(attrib) }
end
于 2012-07-19T14:24:40.460 回答
1

您可以传递任意数量respond_to的方法名称:

it { should respond_to(:name, :email, :password) }

与为每个属性创建单独的示例相比,这样做的一个好处是运行速度更快,因为它是一个示例而不是 n 个示例。

综上所述:我建议不要像这样在测试中指定所有公共属性。这是结构,而不是行为[1]。你的用户模型必须有一些行为保证它需要每个属性。我会专注于指定这些行为(使用模型的公共 API),而不用担心指定实现细节(例如模型具有哪些属性)。

我发现should respond_to有用的一次是当我有一个希望多个类实现的公共接口时。我创建了一个共享示例组,它以最简单的形式指定类的实例对接口的所有部分的响应。

[1] http://blog.davidchelimsky.net/2012/02/12/validations-are-behavior-associations-are-structure/

于 2012-07-19T15:07:15.513 回答