quality icon indicating copy to clipboard operation
quality copied to clipboard

Mocha-related test failures

Open apiology opened this issue 5 years ago • 7 comments

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

apiology avatar Dec 07 '19 14:12 apiology

This appears to be related to https://github.com/freerange/mocha/issues/436

apiology avatar Dec 14 '19 13:12 apiology

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.

apiology avatar Dec 14 '19 13:12 apiology

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

apiology avatar Dec 14 '19 13:12 apiology

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.

floehopper avatar Dec 16 '19 10:12 floehopper

@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.

floehopper avatar Dec 16 '19 13:12 floehopper

There's now a new release of mocha (v1.11.0) which contains both freerange/mocha#441 & freerange/mocha#444.

floehopper avatar Dec 16 '19 19:12 floehopper

I've opened #125 to demonstrate how you might solve this problem. Let me know if you have any questions.

floehopper avatar Dec 16 '19 20:12 floehopper