Database Cleaner not working in minitest rails

后端 未结 5 619
慢半拍i
慢半拍i 2021-01-02 14:48

My Minitest controller tests are working fine if I run them alone using rake minitest:controllers but when I run rake minitest:all then I get valid

相关标签:
5条回答
  • 2021-01-02 15:04

    Short answer:

    gem install "minitest-around"
    

    Long answer:

    before/after or setup/teardown in minitest are NOT hooks as in rspec, therefore you can't have multiple before/after or setup/teardown in minitest, since what they do is just redefining the method.

    To solve this issue, you can use minitest-around, which adds support for multiple before/after or setup/teardown and around, simply add the gem to your test group:

    # put in your Gemfile
    gem 'minitest-around', group: :test
    

    For setting up the database_cleaner, you can have it as you want, following is an example of the setup:

    # tests/support/database_cleaner.rb
    DatabaseCleaner.strategy = :transaction
    DatabaseCleaner.clean_with(:truncation)
    
    class Minitest::Rails::ActionController::TestCase
      def setup
        DatabaseCleaner.start
      end
    
      def teardown
        DatabaseCleaner.clean
      end
    end
    

    And in your test files:

    # tests/your/test/file_test.rb
    require 'support/database_cleaner'
    
    # assertions here ...
    

    That's it, see the Github for detailed info.

    0 讨论(0)
  • 2021-01-02 15:05

    If for whatever reason you don't want to add the 'minitest-around' gem (to have more than one setup and teardown method), you can do this in your test_helper.rb...

    require "database_cleaner"
    DatabaseCleaner.strategy = :transaction
    
    module AroundEachTest
      def before_setup
        super
        DatabaseCleaner.start
      end
    
      def after_teardown
        super
        DatabaseCleaner.clean
      end
    end
    
    class Minitest::Test
      include AroundEachTest
    end
    
    0 讨论(0)
  • 2021-01-02 15:05

    You can DRY up that repetition with this

    DatabaseCleaner.strategy = :truncation
    class MiniTest::Spec
      before :each do
        DatabaseCleaner.clean
      end
    end
    

    This example subclasses the spec runner, but you can pick your test environment of choice.

    0 讨论(0)
  • 2021-01-02 15:06

    I found my mistake ,may be it helps someone else ..

    I should write DatabaseCleaner.start in setup of every model test where setup is defined, as i am overwriting setup method in every test file.

    0 讨论(0)
  • 2021-01-02 15:11

    This is why I like Minitest; no fancy DSL to block thinking about how to use Ruby properly.

    My setup is as follows:

    In test_helper.rb

    class MyTest < Minitest::Test
      def setup
        DatabaseCleaner.start
      end
    
      def teardown
        DatabaseCleaner.clean
      end
    end
    

    Then I just subclass this in any test that need database cleaning. Note the call super first cleans the db before any subclass-specific setup. The same call to super would need to be included in any subclass teardown method, but this can usually be omitted entirely.

    class FooTest < MyTest
      def setup
        super
        @foo = Foo.new(bar: 'whatever')
      end
    
      def test_save
        @foo.save
        assert_equal 1, Foo.count
      end
    end
    

    If I need to subclass MyTest further (e.g. for integration tests) I include its own setup & teardown methods with calls to super so it goes right up the inheritance tree.

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