test/unit/driver_common_tests.rb in qunited-0.3.1 vs test/unit/driver_common_tests.rb in qunited-0.4.0
- old
+ new
@@ -1,70 +1,131 @@
+require 'stringio'
+
# Common driver tests that should pass for any implementation of
# QUnited::Driver::Base. There are also a few utility methods included.
module QUnited::DriverCommonTests
+ def setup
+ start_capture_streams
+ end
+
+ def teardown
+ stop_capture_streams
+ end
+
def test_driver_available
assert driver_class.available?, 'Driver should be available - if it is not then ' +
'either the available? method has a bug or you do not have the proper environment ' +
"to run the driver; check the available? method in the #{driver_class} driver class " +
'to get an idea of whether you should be able to run the driver'
end
def test_running_basic_tests
- results = run_for_project('basic_project')
- assert_equal 3, results.total_tests, 'Correct number of tests run'
- assert_equal 4, results.total_assertions, 'Correct number of assertions executed'
- assert_equal 0, results.total_failures, 'Correct number of failures given'
+ @results = run_tests_for_project('basic_project')
+ assert_equal 3, total_tests, 'Correct number of tests run'
+ assert_equal 4, total_assertions, 'Correct number of assertions executed'
+ assert_equal 0, total_failed_tests, 'Correct number of failures given'
end
# Make sure we can run tests with DOM operations
def test_running_dom_tests
- results = run_for_project('dom_project')
- assert_equal 1, results.total_tests, 'Correct number of tests run'
- assert_equal 2, results.total_assertions, 'Correct number of assertions executed'
- assert_equal 0, results.total_failures, 'Correct number of failures given'
+ @results = run_tests_for_project('dom_project')
+ assert_equal 1, total_tests, 'Correct number of tests run'
+ assert_equal 2, total_assertions, 'Correct number of assertions executed'
+ assert_equal 0, total_failed_tests, 'Correct number of failures given'
end
def test_failures_are_recorded_correctly
- results = run_for_project('failures_project')
- assert_equal 4, results.total_tests, 'Correct number of tests run'
+ @results = run_tests_for_project('failures_project')
+ assert_equal 4, total_tests, 'Correct number of tests run'
# QUnit calls the log callback (the same it calls for assertions) every time there
# is a failed expect(num). So add one to this total.
- assert_equal 5 + 1, results.total_assertions, 'Correct number of assertions executed'
- assert_equal 4, results.total_failures, 'Correct number of failures given'
+ assert_equal 5 + 1, total_assertions, 'Correct number of assertions executed'
+ assert_equal 3, total_failed_tests, 'Correct number of failed tests given'
+ assert_equal 4, total_failed_assertions, 'Correct number of failed assertions given'
+
+ # JavaScript null values should be properly serialized as null by the driver. If they are
+ # they will be deserialized as Ruby nil in QUnitTestResult. Then they can be converted back
+ # into null when displayed by the formatter. Make sure the result has nil.
+ math_test = @results.find { |result| result.name == 'Addition is hard' }
+ null_assertion = math_test.assertions.find { |assertion| assertion.message == 'This expected null' }
+ assert_equal nil, null_assertion.expected
end
def test_syntax_error_in_test
- runner = driver_class.new(
+ driver = driver_class.new(
[File.join(FIXTURES_DIR, 'errors_project/app/assets/javascripts/no_error.js')],
[File.join(FIXTURES_DIR, 'errors_project/test/javascripts/this_test_has_syntax_error.js'),
File.join(FIXTURES_DIR, 'errors_project/test/javascripts/this_test_has_no_errors_in_it.js')])
- stderr = capture_stderr { runner.run }
+ driver.run
+ stderr = captured_stderr
assert stderr.size > 10, 'Got some stderr output to describe the crash'
- results = runner.results
- assert runner.results.failed?, 'Should fail if syntax error in test'
+ @results = driver.results
+ assert total_failed_tests.size > 0, 'Should fail if syntax error in test'
end
+ def test_proper_formatter_methods_are_called_when_tests_pass
+ mock_formatter = mock
+ mock_formatter.expects(:start)
+ mock_formatter.expects(:test_passed).times(3)
+ mock_formatter.expects(:stop)
+ mock_formatter.expects(:summarize)
+
+ run_tests_for_project 'basic_project', :formatter => mock_formatter
+ end
+
protected
def driver_class
raise 'Must implement driver_class and return the driver class being tested'
end
- def run_for_project(project_name)
- runner = runner_for_project(project_name)
- runner.run
+ def run_tests_for_project(project_name, driver_opts={})
+ driver = driver_for_project(project_name, driver_opts)
+ driver.run
end
- def runner_for_project(project_name)
+ def driver_for_project(project_name, opts={})
Dir.chdir File.join(FIXTURES_DIR, project_name)
- driver_class.new("app/assets/javascripts/*.js", "test/javascripts/*.js")
+ driver = driver_class.new("app/assets/javascripts/*.js", "test/javascripts/*.js")
+ driver.formatter = opts[:formatter] if opts[:formatter]
+ driver
end
- def capture_stderr
- previous_stderr, $stderr = $stderr, StringIO.new
- yield
+ def start_capture_streams
+ @original_stdout, $stdout = $stdout, StringIO.new
+ @original_stderr, $stderr = $stderr, StringIO.new
+ end
+
+ def stop_capture_streams
+ $stdout, $stderr = @original_stdout, @original_stderr
+ end
+
+ def captured_stdout
+ $stdout.string
+ end
+
+ def captured_stderr
$stderr.string
- ensure
- $stderr = previous_stderr
+ end
+
+
+ def total_tests
+ @results.size
+ end
+
+ def total_failed_tests
+ @results.select { |tr| tr.failed? }.size
+ end
+
+ def total_error_tests
+ @results.select { |tr| tr.error? }.size
+ end
+
+ def total_assertions
+ @results.inject(0) { |total, result| total += result.assertions.size}
+ end
+
+ def total_failed_assertions
+ @results.inject(0) { |total, result| total += result.assertions.select { |a| a.failed? }.size }
end
end