Как мне использовать rspe c mock методы из собственного DSL - PullRequest
0 голосов
/ 02 апреля 2020

Я пишу тестовую библиотеку, которая работает поверх rspe c. У меня есть пользовательский dsl, который выглядит следующим образом:

rast Worker do
  prepare do |day_type, dow|
    allow(subject).to receive(:holiday?) { day_type == 'Holiday' }
    allow(subject).to receive(:dow) { dow }
  end

  execute do
    result subject.goto_work?
  end
end

Два оператора allow не работают, потому что они находятся внутри моего пользовательского DSL rast с методом prepare. Как я могу заставить его работать?

Внутри метода execute я вызываю этот блок prepare, например:

  def execute
    prepare_block = @prepare_block
    RSpec.describe "test" do
        prepare_block&.call(*params)
    ...

1 Ответ

0 голосов
/ 03 апреля 2020

У меня нет полной картины, но, думаю, и не в голову, вы можете лучше жить с чем-то вроде

RSpec.describe "test" do
  instance_eval(prepare_block, *params) if prepare_block
end

instance_eval будет оценивать блок в контексте получателя (поэтому, что бы self не находилось внутри блока describe).

Если вы просто выполните prepare_block.call, у него не будет доступа ни к каким методам, определенным в контекст, откуда это случилось, как вы узнали.

Удачи!

...