Rails: How to test code in the lib/ directory?

前端 未结 7 1492

I have a model which gets its data from a parser object. I\'m thinking that the parser class should live in the lib/ directory (although I could be persuaded that it should live

相关标签:
7条回答
  • 2021-01-30 07:01

    An easy and clean way is just to create a directory under test/unit/lib. Then create test as test/unit/lib/foo_test.rb corresponding to lib/foo.rb. No new rake tasks required, and you can nest more directories if needed to match the lib directory structure.

    0 讨论(0)
  • 2021-01-30 07:08

    Use:

    [spring] rake test:all
    

    to run all tests, including the directories you created (like [root]/test/lib/).

    Omit [spring] if tou aren't using it.

    0 讨论(0)
  • 2021-01-30 07:11

    To not define additional rake tasks to run tests from the custom defined folders you may also run them with the command rake test:all. Tests folders structure for the lib folder or any other custom folder is up to you. But I prefer to duplicate them in classes: lib is matched to test/lib, app/form_objects to test/form_objects.

    0 讨论(0)
  • 2021-01-30 07:22

    Here's one way:

    Create lib/tasks/test_lib_dir.rake with the following

    namespace :test do
    
      desc "Test lib source"
      Rake::TestTask.new(:lib) do |t|    
        t.libs << "test"
        t.pattern = 'test/lib/**/*_test.rb'
        t.verbose = true    
      end
    
    end
    

    Mimic the structure of your lib dir under the test dir, replacing lib code with corresponding tests.

    Run rake test:lib to run your lib tests.

    If you want all tests to run when you invoke rake test, you could add the following to your new rake file.

    lib_task = Rake::Task["test:lib"]
    test_task = Rake::Task[:test]
    test_task.enhance { lib_task.invoke }
    
    0 讨论(0)
  • 2021-01-30 07:26

    I was looking to do the same thing but with rspec & autospec and it took a little digging to figure out just where they were getting the list of directories / file patterns that dictated which test files to run. Ultimately I found this in lib/tasks/rspec.rake:86

      [:models, :controllers, :views, :helpers, :lib, :integration].each do |sub|
        desc "Run the code examples in spec/#{sub}"
        Spec::Rake::SpecTask.new(sub => spec_prereq) do |t|
          t.spec_opts = ['--options', "\"#{RAILS_ROOT}/spec/spec.opts\""]
          t.spec_files = FileList["spec/#{sub}/**/*_spec.rb"]
        end
      end
    

    I had placed my tests in a new spec/libs directory when the rpsec.rake file was configured to look in spec/lib. Simply renaming libs -> lib did the trick!

    0 讨论(0)
  • 2021-01-30 07:27

    In the Rails application I'm working on, I decided to just place the tests in the test\unit directory. I will also nest them by module/directory as well, for example:

    lib/a.rb   => test/unit/a_test.rb
    lib/b/c.rb => test/unit/b/c_test.rb
    

    For me, this was the path of last resistance, as these tests ran without having to make any other changes.

    0 讨论(0)
提交回复
热议问题