【问题标题】:Rails Minitest model method testRails Minitest 模型方法测试
【发布时间】:2021-04-29 22:58:39
【问题描述】:

我有计算用户成员数量的用户模型方法。我想通过 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

但老实说,我不知道如何比较它是否返回正确的字符串。

【问题讨论】:

  • 期望返回什么方法? "Member for 2y, 3m",对吧?所以写你的测试要有这个期望。
  • 您可以在MiniTest 中使用assert_equal 执行此操作。
  • @TomLord 好的,我已经用assert_equal 'Member for 2y, 3m', user.member_for 的最后一行更新了user.created_at = 2.years.ago - 4.months,它可以工作了!谢谢!

标签: ruby-on-rails ruby minitest


【解决方案1】:

您可以通过简单地迭代各个部分来降低循环复杂性并删除几个给出错误持续时间的错误(通过省略几周和几个月):

  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

但是,如果这段代码真的属于一个模型,那么它是否真的属于一个模型,因为它的呈现而不是商业逻辑。我会说帮助者或装饰者/演示者更合适,然后将更多逻辑塞进你的模型中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-21
    • 1970-01-01
    • 2016-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多