tsdbrown tsdbrown - 4 months ago 24
Ruby Question

Rails: How do I write tests for a ruby module?

I would like to know how to write unit tests for a module that is mixed into a couple of classes but don't quite know how to go about it:

  1. Do I test the instance methods by writing tests in one of the test files for a class that includes them (doesn't seem right) or can you somehow keep the tests for the included methods in a separate file specific to the module?

  2. The same question applies to the class methods.

  3. Should I have a separate test file for each of the classes in the module like normal rails models do, or do they live in the general module test file, if that exists?


IMHO, you should be doing functional test coverage that will cover all uses of the module, and then test it in isolation in a unit test:

setup do
  @object = Object.new

should "greet person" do
  @object.stubs(:format).returns("Hello {{NAME}}")
  assert_equal "Hello World", @object.greet("World")

should "greet person in pirate" do
  @object.stubs(:format).returns("Avast {{NAME}} lad!")
  assert_equal "Avast Jim lad!", @object.greet("Jim")

If your unit tests are good, you should be able to just smoke test the functionality in the modules it is mixed into.


Write a test helper, that asserts the correct behaviour, then use that against each class it's mixed in. Usage would be as follows:

setup do
  @object = FooClass.new


If your unit tests are good, this can be a simple smoke test of the expected behavior, checking the right delegates are called etc.