rails / thor

Thor is a toolkit for building powerful command-line interfaces.
http://whatisthor.com/
MIT License
5.14k stars 553 forks source link

Calling `invoke` directly in RSpec breaks with required class_options, even when they are provided. #811

Open WriterZephos opened 1 year ago

WriterZephos commented 1 year ago

I am trying to test my Thor tasks and running into an issue. I have the following option defined on my Thor class:

class_option :file_path, required: true, type: :string, aliases: :f

and in my tests I have:

  let(:options){
    {
      :file_path => "v_1.0.0/chapter_1/content.md"
    }
  }

  ...

    it "does a dry run render of html" do
      expect{ ::MyThorTask.new.invoke(:foo, [], options) }.to output(...).to_stdout
    end

Which give me this error:

     Thor::RequiredArgumentMissingError:
       No value provided for required options '--file-path'

But I can run the Thor task in the terminal just fine, so I think there is something broken with invoke.

kumar1202 commented 1 week ago

Facing the same issue for this scenario, I had to set the required parameter for that option as false, and add a custom validation logic to check if all of my required parameters were passed correctly to avoid this spec issue.

Let me try to find more about the root cause.