quality
quality copied to clipboard
Mocha-related test failures
With Mocha 1.10.0 and 1.10.1 (upgraded from 1.9.0), I get the following errors on the existing tests:
-*- mode: compilation; default-directory: "~/src/quality/" -*-
Compilation started at Sat Dec 7 09:28:04
cd /Users/broz/src/quality/ && make
bundle exec rake localtest
2019-12-07 09:28:11 -0500
/Users/broz/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/charlock_holmes-0.7.7/lib/charlock_holmes/encoding_detector.rb:66: warning: instance variable encoding_list not initialized
Mocha deprecation warning at /Users/broz/src/quality/test/unit/test_helper.rb:16:in `require': Require 'mocha/test_unit', 'mocha/minitest' or 'mocha/api' instead of 'mocha/setup'.
Run options: --seed 31019
# Running:
..............cane not installed
EE....Processing file1
Processing file2
...........
Finished in 0.120743s, 256.7437 runs/s, 1548.7440 assertions/s.
1) Error:
TestTask#test_quality_task_some_not_installed:
LocalJumpError: no block given (yield)
/Users/broz/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/mocha-1.10.1/lib/mocha/expectation.rb:571:in `block in invoke'
/Users/broz/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/mocha-1.10.1/lib/mocha/invocation.rb:22:in `block in call'
/Users/broz/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/mocha-1.10.1/lib/mocha/multiple_yields.rb:11:in `block in each'
/Users/broz/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/mocha-1.10.1/lib/mocha/multiple_yields.rb:10:in `each'
/Users/broz/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/mocha-1.10.1/lib/mocha/multiple_yields.rb:10:in `each'
/Users/broz/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/mocha-1.10.1/lib/mocha/invocation.rb:20:in `call'
/Users/broz/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/mocha-1.10.1/lib/mocha/expectation.rb:571:in `invoke'
/Users/broz/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/mocha-1.10.1/lib/mocha/mock.rb:315:in `method_missing'
/Users/broz/src/quality/lib/quality/runner.rb:109:in `ratchet_quality_cmd'
/Users/broz/.rbenv/versions/2.6.5/lib/ruby/2.6.0/forwardable.rb:230:in `ratchet_quality_cmd'
/Users/broz/src/quality/lib/quality/tools/shellcheck.rb:12:in `quality_shellcheck'
/Users/broz/src/quality/lib/quality/runner.rb:49:in `call'
/Users/broz/src/quality/lib/quality/runner.rb:49:in `run_quality_with_tool'
/Users/broz/src/quality/lib/quality/runner.rb:39:in `block in run_quality'
/Users/broz/src/quality/lib/quality/runner.rb:38:in `each'
/Users/broz/src/quality/lib/quality/runner.rb:38:in `run_quality'
/Users/broz/src/quality/lib/quality/rake/task.rb:85:in `block in define'
/Users/broz/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/mocha-1.10.1/lib/mocha/expectation.rb:571:in `block in invoke'
/Users/broz/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/mocha-1.10.1/lib/mocha/invocation.rb:22:in `block in call'
/Users/broz/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/mocha-1.10.1/lib/mocha/single_yield.rb:10:in `each'
/Users/broz/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/mocha-1.10.1/lib/mocha/invocation.rb:20:in `call'
/Users/broz/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/mocha-1.10.1/lib/mocha/expectation.rb:571:in `invoke'
/Users/broz/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/mocha-1.10.1/lib/mocha/mock.rb:315:in `method_missing'
/Users/broz/src/quality/lib/quality/rake/task.rb:85:in `define'
/Users/broz/src/quality/lib/quality/rake/task.rb:65:in `initialize'
/Users/broz/src/quality/test/unit/base_test_task.rb:17:in `new'
/Users/broz/src/quality/test/unit/base_test_task.rb:17:in `get_test_object'
/Users/broz/src/quality/test/unit/test_task.rb:20:in `test_quality_task_some_not_installed'
2) Error:
TestTask#test_quality_task_some_suppressed:
LocalJumpError: no block given (yield)
/Users/broz/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/mocha-1.10.1/lib/mocha/expectation.rb:571:in `block in invoke'
/Users/broz/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/mocha-1.10.1/lib/mocha/invocation.rb:22:in `block in call'
/Users/broz/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/mocha-1.10.1/lib/mocha/multiple_yields.rb:11:in `block in each'
/Users/broz/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/mocha-1.10.1/lib/mocha/multiple_yields.rb:10:in `each'
/Users/broz/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/mocha-1.10.1/lib/mocha/multiple_yields.rb:10:in `each'
/Users/broz/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/mocha-1.10.1/lib/mocha/invocation.rb:20:in `call'
/Users/broz/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/mocha-1.10.1/lib/mocha/expectation.rb:571:in `invoke'
/Users/broz/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/mocha-1.10.1/lib/mocha/mock.rb:315:in `method_missing'
/Users/broz/src/quality/lib/quality/runner.rb:109:in `ratchet_quality_cmd'
/Users/broz/.rbenv/versions/2.6.5/lib/ruby/2.6.0/forwardable.rb:230:in `ratchet_quality_cmd'
/Users/broz/src/quality/lib/quality/tools/shellcheck.rb:12:in `quality_shellcheck'
/Users/broz/src/quality/lib/quality/runner.rb:49:in `call'
/Users/broz/src/quality/lib/quality/runner.rb:49:in `run_quality_with_tool'
/Users/broz/src/quality/lib/quality/runner.rb:39:in `block in run_quality'
/Users/broz/src/quality/lib/quality/runner.rb:38:in `each'
/Users/broz/src/quality/lib/quality/runner.rb:38:in `run_quality'
/Users/broz/src/quality/lib/quality/rake/task.rb:85:in `block in define'
/Users/broz/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/mocha-1.10.1/lib/mocha/expectation.rb:571:in `block in invoke'
/Users/broz/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/mocha-1.10.1/lib/mocha/invocation.rb:22:in `block in call'
/Users/broz/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/mocha-1.10.1/lib/mocha/single_yield.rb:10:in `each'
/Users/broz/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/mocha-1.10.1/lib/mocha/invocation.rb:20:in `call'
/Users/broz/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/mocha-1.10.1/lib/mocha/expectation.rb:571:in `invoke'
/Users/broz/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/mocha-1.10.1/lib/mocha/mock.rb:315:in `method_missing'
/Users/broz/src/quality/lib/quality/rake/task.rb:85:in `define'
/Users/broz/src/quality/lib/quality/rake/task.rb:65:in `initialize'
/Users/broz/src/quality/test/unit/base_test_task.rb:17:in `new'
/Users/broz/src/quality/test/unit/base_test_task.rb:17:in `get_test_object'
/Users/broz/src/quality/test/unit/test_task.rb:10:in `test_quality_task_some_suppressed'
31 runs, 187 assertions, 0 failures, 2 errors, 0 skips
Coverage report generated for Unit Tests to /Users/broz/src/quality/coverage. 1136 / 1164 LOC (97.59%) covered.
[Coveralls] Outside the Travis environment, not sending data.
SimpleCov failed with exit 1rake aborted!
Command failed with status (1)
/Users/broz/.rbenv/versions/2.6.5/bin/bundle:23:in `load'
/Users/broz/.rbenv/versions/2.6.5/bin/bundle:23:in `<main>'
Tasks: TOP => localtest => test
(See full trace by running task with --trace)
make: *** [localtest] Error 1
Compilation exited abnormally with code 2 at Sat Dec 7 09:28:22
This appears to be related to https://github.com/freerange/mocha/issues/436
Worked around in https://github.com/apiology/quality/pull/122/commits/ec9b4ce0f5bb7f0db84316c6bb4a4d57bb924f4f
Not sure how long term of a fix that's going to be; there's still a DeprecationWarning.
Well, I guess not really - I just got another error when I tried the workaround - see the commit comment in https://github.com/apiology/quality/pull/122/commits/ea899c6253872fec1ce041f136f66d82c5c04e29
Well, I guess not really - I just got another error when I tried the workaround - see the commit comment in ea899c6
@apiology Sorry to hear this. I've opened a new issue and am investigating.
@apiology:
It turns out that you were relying on some undocumented behaviour of Expectation#multiple_yields
which was assuming all its arguments were Arrays. Unfortunately some recently introduced code in Mocha assumed that this was always the case and raised a NoMethodError
when it was not.
FWIW I believe you could fix the problem by changing this line from:
quality_checker.expects(:execute).multiple_yields(*lines)
to:
quality_checker.expects(:execute).multiple_yields(*lines.map { |line| [line] })
However, since the undocumented behaviour of Expectation#multiple_yields
seems reasonable, I've just opened a pull request to implement it & document it properly. So you could wait until that is released instead.
I have verified that this PR ☝️ does indeed fix the build on your branch. Hopefully when this other pull request gets merged you'll have a solution which avoids the deprecation warnings too.
Let me know if you have any questions.
There's now a new release of mocha (v1.11.0) which contains both freerange/mocha#441 & freerange/mocha#444.
I've opened #125 to demonstrate how you might solve this problem. Let me know if you have any questions.