如何解决Rails Minitest 模型方法测试
我有 User 模型方法,可以计算一些用户成员资格。我想通过 MiniTest 对其进行测试。这是我所拥有的:
def member_for
time_diff = Time.current - created_at
result = ActiveSupport::Duration.build(time_diff.to_i).parts
return "Member for #{result[:years]}y,#{result[:months]}m" if result.key?(:years) && result.key?(:months)
if result.key?(:years) && result.key?(:days)
"Member for #{result[:years]}y,#{result[:days]}d"
elsif result.key?(:months)
"Member for #{result[:months]}m"
elsif result.key?(:days)
"Member for #{result[:days]}d"
end
end
我正在尝试编写一些 MiniTest:
test 'member for' do
user.created_at = 2.years.ago + 3.months + 2.days
user.member_for
end
private
def user
@user ||= users(:one)
end
但老实说,我不知道如何比较它是否返回正确的字符串。
解决方法
您可以通过简单地迭代各个部分来降低循环复杂度并消除一些导致错误持续时间(通过省略数周和数月)的错误:
def member_for
time_diff = Time.current - created_at
parts = ActiveSupport::Duration.build(time_diff.to_i).parts
formatted = parts.except(:seconds).map do |unit,value|
"#{value} #{unit}"
end
"Member for #{formatted.to_sentance}"
end
如果您想使用缩写而不是完整的单位名称,您可以使用简单的查找表或 I18n
API。 Array#to_sentance
来自 ActiveSupport。
然后您可以通过以下方式进行测试:
class MemberTest < ActiveSupport::TestCase
test 'member_for without weeks' do
user.created_at = 2.years.ago + 3.months + 2.days
assert_equal(user.member_for,'Member for 1 year,3 months and 2 days')
end
test 'member_for with weeks' do
user.created_at = 2.years.ago + 2.weeks
assert_equal(user.member_for,'Member for 1 year and 2 weeks')
end
private
def user
@user ||= users(:one)
end
end
然而,自从它的呈现而不是商业逻辑以来,这段代码是否真的首先属于一个模型是值得怀疑的。我会说助手或装饰者/演示者比在模型中塞入更多逻辑更合适。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。