Rspe c назначение атрибутов теста во время теста - PullRequest
0 голосов
/ 06 марта 2020

В Rails я хочу протестировать рабочий процесс, в котором модель имеет статус idle, затем получает status running, а после завершения рабочего процесса устанавливается состояние idle.

Легко проверить, установлен ли статус на idle с помощью Rspe c, но у меня нет возможности проверить, было ли его состояние установлено на running во время выполнения рабочего процесса.

Моими первыми мыслями было использовать has_changed?, но это неправильно, так как статус также будет изменен после выполнения рабочего процесса. Я также рассмотрел receive, но я не понимаю синтаксис для использования там.

Проверка изменения модели:

expect{ SomeTrigger }.to change { Workflow.status }.from('a').to('b')

Проверка, имеет ли атрибут значение, отличное от предыдущего:

expect{ Workflow.status_changed? }.to be_truthy

Есть ли в Rspe c способ проверить, получила ли модель заданные c атрибуты и значения в течение своего жизненного цикла?

Ответы [ 2 ]

0 голосов
/ 06 марта 2020

По вашим комментариям это звучит так, как будто вы тестируете детали реализации или должны немного разбить метод.

В любом случае, вы можете погрузиться в функции rspec-mocks для достижения то, что вы хотите утверждать (см. https://relishapp.com/rspec/rspec-mocks/v/3-9/docs/setting-constraints/receive-counts)

expect(Workflow).to receive(:running!).exactly(1).time
SomeTrigger
expect(Workflow.idle?).to be_truthy

(использование attribute_changed? методов из active_record в утверждениях - это то, что я бы очень не рекомендуем)

РЕДАКТИРОВАТЬ: или как @DonMB , упомянутый в комментариях (извините, вы прокомментировали, когда я писал ответ), попробуйте подтвердить аргументы, которые отправляются в attribute_accessor https://relishapp.com/rspec/rspec-mocks/v/3-9/docs/setting-constraints/matching-arguments

0 голосов
/ 06 марта 2020

Попробуйте:

expect { SomeTrigger }.to change { Workflow.status }.from('a').to('b')

Подробнее: https://relishapp.com/rspec/rspec-expectations/v/2-0/docs/matchers/expect-change

Где пример, который они дают:

class Counter
  class << self
    def increment
      @count ||= 0
      @count += 1
    end

    def count
      @count ||= 0
    end
  end
end

describe Counter, "#increment" do
  it "should not increment the count by 2" do
    expect{Counter.increment}.to_not change{Counter.count}.from(0).to(2)
  end

  # deliberate failure
  it "should not increment the count by 1" do
    expect{Counter.increment}.to_not change{Counter.count}.by(1)
  end
end
...