Каков наилучший способ заглушки даты в спецификации? - PullRequest
0 голосов
/ 01 апреля 2019

Я использую Rails 5.2.2.1 и Rspec.Пожалуйста, как я могу заглушить время, чтобы этот тест всегда был зеленым?

Немного отредактировал. Я добавил Timecop как предложено и обновил мой вопрос, но он все еще не работает

Сегодня мойтест не пройден, потому что это первый день месяца ...

  before(:each) do
    Timecop.freeze(Time.local(2019, 03, 31, 12, 0, 0))
  end

  let(:date_from) { Timecop.freeze(Time.local(2019, 03, 26, 12, 0, 0)) }
  let(:date_to)   { Timecop.freeze(Time.local(2019, 03, 31, 12, 0, 0)) }

  subject { Dashboard.new(date_from: @date_from, date_to: @date_to) }
describe "#sales_by_week" do 
    it "returns the  number of sales by week" do
        create(:sale, created_at: 2.weeks.ago)
        create(:sale, created_at: 3.days.ago)
        create(:sale, created_at: Date.today )

        res = subject.sales_by_week

        expect(res.values.last).to eq(2)
    end
end

describe "#sales_by_month" do 
        it "returns the number of sales by month" do
            create(:sale, created_at: 2.day.ago)
            create(:sale, created_at: 1.day.ago)

            res = subject.sales_by_month

            expect(res.values.last).to eq(2)
        end
    end

Вот метод, который я тестирую:

class Dashboard
    attr_reader :date_from, :date_to

    def initialize(params)
        params ||= {}
        @date_from = parsed_date(params[:date_from],Time.now.beginning_of_month.to_date.to_s)
        @date_to   = parsed_date(params[:date_to], (Date.today + 1).to_s)
    end

    def sales_by_week
      Sale.group_by_week(:created_at, range: (@date_from..@date_to),time_zone: "Paris", week_start: :mon).count
    end

    def sales_by_month
      Sale.group_by_month(:created_at, range: (@date_from..@date_to),time_zone: "Paris", week_start: :mon).count
    end
   end

1 Ответ

1 голос
/ 01 апреля 2019

Вы можете использовать Timecop : он обеспечивает очень простой способ freeze времени в любой точке, которую вы хотите, например:

describe "#sales_by_week" do
 before { Timecop.freeze(Time.now.beginning_of_week+6.days) }

 it "returns the  number of sale by week" do
  create(:sale, created_at: 2.weeks.ago)
  create(:sale, created_at: 3.days.ago)
  create(:sale, created_at: Date.today )

  res = subject.sales_by_week

  expect(res.values.last).to eq(2)
 end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...