Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 用于验证生成对象或测试函数的RSpec?_Ruby_Rspec - Fatal编程技术网

Ruby 用于验证生成对象或测试函数的RSpec?

Ruby 用于验证生成对象或测试函数的RSpec?,ruby,rspec,Ruby,Rspec,下面是我编写的第一个RSpec测试之一,在实现它之后,有几个问题留给了我 测试使用不同的输入运行相同的方法计算,并验证生成的对象。但是,像day\u off?这样的单个小方法没有经过明确的测试 我应该为各个方法编写测试,而不是验证生成的对象吗?或者仅仅验证输出就足够了?或者实际上应该同时测试单个方法和输出 我想典型的答案是“视情况而定”,但取决于什么 我真的希望这不会成为一个主观的问题,因为我认为可能会有一个有用的答案 完整的代码可在以下位置找到: 下面是要测试的类: class WeeklyF

下面是我编写的第一个RSpec测试之一,在实现它之后,有几个问题留给了我

测试使用不同的输入运行相同的方法
计算
,并验证生成的对象。但是,像
day\u off?
这样的单个小方法没有经过明确的测试

我应该为各个方法编写测试,而不是验证生成的对象吗?或者仅仅验证输出就足够了?或者实际上应该同时测试单个方法和输出

我想典型的答案是“视情况而定”,但取决于什么

我真的希望这不会成为一个主观的问题,因为我认为可能会有一个有用的答案

完整的代码可在以下位置找到:

下面是要测试的类:

class WeeklyFlexCalculator

  attr_reader :params

  def initialize(params)
    @params = params
  end

  def calculate
    group_efforts(
      (params.start_date..params.end_date).map do |date|
        daily_effort(date)
      end.compact
    )
  end

  def group_efforts(result)
    weekly = result.group_by { |e| get_week_key(e[:date]) }
    weekly.map do |key,w|
      {
        year: get_year_from_week_key(key),
        week: get_week_from_week_key(key),
        weekTarget: get_target_sum(w),
        weekEffort: get_effort_sum(w),
        efforts: w
      }
    end.sort { |a, b| b.efforts[0].date <=> a.efforts[0].date }
  end

  def daily_effort(date)
      target = get_target(date)
      effort = get_effort(date)
      return if target == 0 && effort == 0
      {
        date: date,
        effort: effort,
        target: target,
        diff: effort - target
      }
  end

  def get_target_sum(efforts)
    efforts.inject(0){|sum,e| sum + e[:target]}
  end

  def get_effort_sum(efforts)
    efforts.inject(0){|sum,e| sum + e[:effort]}
  end

  def get_week_key(date)
    date.cwyear.to_s + "|" + date.cweek.to_s
  end

  def get_year_from_week_key(key)
    key.split('|')[0]
  end

  def get_week_from_week_key(key)
    key.split('|')[1]
  end

  def get_target(date)
    day_off?(date) ? 0 : params.user.hours_per_day
  end

  def get_effort(date)
    ts = get_timesheet(date)
    ts.nil? ? 0.0 : ts.TimeInHours
  end

  def day_off?(date)
    date.wday == 0 or date.wday == 6 or params.holidays.include? date.to_s
  end

  def get_timesheet(date)
    params.timesheets.select {|ts| ts.Date == date.to_s}.first
  end
end

我会全部测试。对我来说,
休息日?
在功能上是正确的,这让我感到欣慰。如果我没有测试这个方法,我总是会有点紧张,因为我的
计算测试可能会“神奇地”工作,仅仅是因为在
休息日发生了一些未知的错误?

require './WeeklyFlexCalculator'

describe WeeklyFlexCalculator, "during Christmas week" do

  subject(:calculation) { WeeklyFlexCalculator.new(params).calculate }

  let(:params) do
    messages = {
      :start_date => Date.new(2013,12,23),
      :end_date => Date.new(2013,12,29),
      :holidays => ["2013-12-24", "2013-12-25", "2013-12-26"],
      :timesheets => [],
      :user => user
    }
    double(:params,messages)
  end

  let(:user) do
    messages = {
      :hours_per_day => 7.5
    }
    double(:user, messages)
  end

  let(:timesheet) do
    messages = {
      :Date => Date.new(2013,12,23).to_s,
      :TimeInHours => 5.0
    }
    double(:timesheet, messages)
  end

  context "with no work performed" do
    it { should have(1).item }

    context "the week calculated" do
      subject(:workweek) {calculation[0]}

      its([:year]) { should eq "2013" }
      its([:week]) { should eq "52" }
      its([:weekTarget]) { should eq 15.0 }
      its([:weekEffort]) { should eq 0.0 }

      context "the work efforts" do
        subject(:efforts) {workweek[:efforts]}

        it { should have(2).items }

        context "the first work effort" do
          subject(:effort) {efforts[0]}

          its([:target]) {should eq 7.5}
          its([:diff]) {should eq -7.5}
          its([:effort]) {should eq 0.0}
        end
      end
    end
  end

  context "with work effort on normal day" do
    before do
      params.stub(:timesheets => [timesheet])
    end

    it { should have(1).item }

    context "the week calculated" do
      subject(:workweek) {calculation[0]}

      its([:year]) { should eq "2013" }
      its([:week]) { should eq "52" }
      its([:weekTarget]) { should eq 15.0 }
      its([:weekEffort]) { should eq 5.0 }

      context "the work efforts" do
        subject(:efforts) {workweek[:efforts]}

        it { should have(2).items }

        context "the first work effort" do
          subject(:effort) {efforts[0]}

          its ([:effort]) { should eq 5.0 }
          its ([:diff]) { should eq -2.5 }
        end
      end
    end
  end

  context "with work effort on a holiday" do
    before do
      timesheet.stub(:Date => Date.new(2013,12,24).to_s)
      params.stub(:timesheets => [timesheet])
    end

    it { should have(1).item }

    context "the week calculated" do
      subject(:workweek) {calculation[0]}

      its([:year]) { should eq "2013" }
      its([:week]) { should eq "52" }
      its([:weekTarget]) { should eq 15.0 }
      its([:weekEffort]) { should eq 5.0 }

      context "the work efforts" do
        subject(:efforts) {workweek[:efforts]}

        it { should have(3).items }

        context "the first work effort" do
          subject(:effort) {efforts[0]}

          its ([:effort]) { should eq 0.0 }
          its ([:diff]) { should eq -7.5 }
        end

        context "the second work effort" do
          subject(:effort) {efforts[1]}

          its ([:effort]) {should eq 5.0}
          its ([:diff]) { should eq 5.0}
        end
      end
    end
  end
end