Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

seneca catch error that should be catched by mocha #35

Closed
nherment opened this issue May 13, 2014 · 16 comments
Closed

seneca catch error that should be catched by mocha #35

nherment opened this issue May 13, 2014 · 16 comments

Comments

@nherment
Copy link

I'm not sure if that is the same issue as seneca catching 'uncaught exceptions' but I have a test with 'asserts'. I'd expect the tests to fail with an error for which the stack top level line is where the assert line is, not in seneca's internals.

The test (edited):

describe('archive', function() {

  it('save', function(done) {

    var foobarEntity = primarySeneca.make('foo/bar')

    foobarEntity.save$({db: 'primary', archiveAttr: false}, function(err, result) {

      assert.ok(!err, err ? err.message + err.stack : undefined)

      foobarEntity.save$({db: 'secondary', archiveAttr: true}, function(err, secondaryResult) {
        assert.ok(!err, err ? err.message + err.stack : undefined)


        var foobarEntitySecondary = secondarySeneca.make('foo/bar')
        foobarEntitySecondary.load$({id: secondaryResult.id}, function(err, archivedEntity) {

          assert.ok(!err, err ? err.message + err.stack : undefined)
          assert.ok(archivedEntity)
          assert.equal(archivedEntity.id, secondaryResult.id)     

          done()     

        })

      })

    })

  })
})

The logs:

2014-05-13T15:34:23.120Z    ERROR   act err 0ptr7z  callback    Seneca/0.5.17/xauigd: {name=AssertionError,actual=,expected=true,operator===,message=null == true}  botzgv      at Seneca.<anonymous> (/Users/nherment/workspace/seneca-archive/node_modules/seneca/plugin/mem-store.js:133:9)
    1) save
    ✓ list 


  12 passing (18ms)
  1 failing

  1) archive save:
     Error: Seneca/0.5.17/xauigd: {name=AssertionError,actual=,expected=true,operator===,message=null == true}
      at act_done (/Users/nherment/workspace/seneca-archive/node_modules/seneca/lib/seneca.js:1529:25)
      at Seneca.<anonymous> (/Users/nherment/workspace/seneca-archive/node_modules/seneca/plugin/mem-store.js:133:9)
      at list (/Users/nherment/workspace/seneca-archive/node_modules/seneca/plugin/mem-store.js:55:6)
      at Seneca.store.load (/Users/nherment/workspace/seneca-archive/node_modules/seneca/plugin/mem-store.js:130:7)
      at perform (/Users/nherment/workspace/seneca-archive/node_modules/seneca/lib/seneca.js:1551:22)
      at do_act (/Users/nherment/workspace/seneca-archive/node_modules/seneca/lib/seneca.js:1422:17)
      at Seneca.api_act [as act] (/Users/nherment/workspace/seneca-archive/node_modules/seneca/lib/seneca.js:1255:10)
      at Entity.load$ (/Users/nherment/workspace/seneca-archive/node_modules/seneca/lib/entity.js:192:6)
      at Seneca.<anonymous> (/Users/nherment/workspace/seneca-archive/test/archive.test.js:37:31)
      at act_done (/Users/nherment/workspace/seneca-archive/node_modules/seneca/lib/seneca.js:1516:16)
      at Seneca.<anonymous> (/Users/nherment/workspace/seneca-archive/archive.js:119:9)
      at act_done (/Users/nherment/workspace/seneca-archive/node_modules/seneca/lib/seneca.js:1516:16)
      at do_save (/Users/nherment/workspace/seneca-archive/node_modules/seneca/plugin/mem-store.js:121:9)
      at Seneca.<anonymous> (/Users/nherment/workspace/seneca-archive/node_modules/seneca/plugin/mem-store.js:100:13)
      at act_done (/Users/nherment/workspace/seneca-archive/node_modules/seneca/lib/seneca.js:1516:16)
      at Seneca.cmd_generate_id (/Users/nherment/workspace/seneca-archive/node_modules/seneca/plugin/util.js:85:5)
      at perform (/Users/nherment/workspace/seneca-archive/node_modules/seneca/lib/seneca.js:1551:22)
      at do_act (/Users/nherment/workspace/seneca-archive/node_modules/seneca/lib/seneca.js:1422:17)
      at Seneca.api_act (/Users/nherment/workspace/seneca-archive/node_modules/seneca/lib/seneca.js:1255:10)
      at Seneca.delegate.act (/Users/nherment/workspace/seneca-archive/node_modules/seneca/lib/seneca.js:1825:11)
      at Seneca.delegate.act (/Users/nherment/workspace/seneca-archive/node_modules/seneca/lib/seneca.js:1825:11)
      at Seneca.store.save (/Users/nherment/workspace/seneca-archive/node_modules/seneca/plugin/mem-store.js:98:16)
      at perform (/Users/nherment/workspace/seneca-archive/node_modules/seneca/lib/seneca.js:1551:22)
      at do_act (/Users/nherment/workspace/seneca-archive/node_modules/seneca/lib/seneca.js:1422:17)
      at Seneca.delegate.prior.delegate.parent (/Users/nherment/workspace/seneca-archive/node_modules/seneca/lib/seneca.js:1458:13)
      at Seneca.executePrimaryThenFallbackToSecondary (/Users/nherment/workspace/seneca-archive/archive.js:108:10)
      at Seneca.saveOverride (/Users/nherment/workspace/seneca-archive/archive.js:42:45)
      at perform (/Users/nherment/workspace/seneca-archive/node_modules/seneca/lib/seneca.js:1551:22)
      at do_act (/Users/nherment/workspace/seneca-archive/node_modules/seneca/lib/seneca.js:1422:17)
      at Seneca.api_act [as act] (/Users/nherment/workspace/seneca-archive/node_modules/seneca/lib/seneca.js:1255:10)
      at Entity.save$ (/Users/nherment/workspace/seneca-archive/node_modules/seneca/lib/entity.js:160:6)
      at Seneca.<anonymous> (/Users/nherment/workspace/seneca-archive/test/archive.test.js:32:20)
      at act_done (/Users/nherment/workspace/seneca-archive/node_modules/seneca/lib/seneca.js:1516:16)
      at Seneca.<anonymous> (/Users/nherment/workspace/seneca-archive/archive.js:119:9)
      at act_done (/Users/nherment/workspace/seneca-archive/node_modules/seneca/lib/seneca.js:1516:16)
      at do_save (/Users/nherment/workspace/seneca-archive/node_modules/seneca/plugin/mem-store.js:121:9)
      at Seneca.<anonymous> (/Users/nherment/workspace/seneca-archive/node_modules/seneca/plugin/mem-store.js:100:13)
      at act_done (/Users/nherment/workspace/seneca-archive/node_modules/seneca/lib/seneca.js:1516:16)
      at Seneca.cmd_generate_id (/Users/nherment/workspace/seneca-archive/node_modules/seneca/plugin/util.js:85:5)
      at perform (/Users/nherment/workspace/seneca-archive/node_modules/seneca/lib/seneca.js:1551:22)
      at do_act (/Users/nherment/workspace/seneca-archive/node_modules/seneca/lib/seneca.js:1422:17)
      at Seneca.api_act (/Users/nherment/workspace/seneca-archive/node_modules/seneca/lib/seneca.js:1255:10)
      at Seneca.delegate.act (/Users/nherment/workspace/seneca-archive/node_modules/seneca/lib/seneca.js:1825:11)
      at Seneca.delegate.act (/Users/nherment/workspace/seneca-archive/node_modules/seneca/lib/seneca.js:1825:11)
      at Seneca.store.save (/Users/nherment/workspace/seneca-archive/node_modules/seneca/plugin/mem-store.js:98:16)
      at perform (/Users/nherment/workspace/seneca-archive/node_modules/seneca/lib/seneca.js:1551:22)
      at do_act (/Users/nherment/workspace/seneca-archive/node_modules/seneca/lib/seneca.js:1422:17)
      at Seneca.delegate.prior.delegate.parent (/Users/nherment/workspace/seneca-archive/node_modules/seneca/lib/seneca.js:1458:13)
      at Seneca.executePrimaryThenFallbackToSecondary (/Users/nherment/workspace/seneca-archive/archive.js:108:10)
      at Seneca.saveOverride (/Users/nherment/workspace/seneca-archive/archive.js:42:45)
      at perform (/Users/nherment/workspace/seneca-archive/node_modules/seneca/lib/seneca.js:1551:22)
      at do_act (/Users/nherment/workspace/seneca-archive/node_modules/seneca/lib/seneca.js:1422:17)
      at Seneca.api_act [as act] (/Users/nherment/workspace/seneca-archive/node_modules/seneca/lib/seneca.js:1255:10)
      at Entity.save$ (/Users/nherment/workspace/seneca-archive/node_modules/seneca/lib/entity.js:160:6)
      at Context.<anonymous> (/Users/nherment/workspace/seneca-archive/test/archive.test.js:28:18)
      at Test.Runnable.run (/Users/nherment/workspace/seneca-archive/node_modules/mocha/lib/runnable.js:196:15)
      at Runner.runTest (/Users/nherment/workspace/seneca-archive/node_modules/mocha/lib/runner.js:374:10)
      at /Users/nherment/workspace/seneca-archive/node_modules/mocha/lib/runner.js:452:12
      at next (/Users/nherment/workspace/seneca-archive/node_modules/mocha/lib/runner.js:299:14)
      at /Users/nherment/workspace/seneca-archive/node_modules/mocha/lib/runner.js:309:7
      at next (/Users/nherment/workspace/seneca-archive/node_modules/mocha/lib/runner.js:247:23)
      at Object._onImmediate (/Users/nherment/workspace/seneca-archive/node_modules/mocha/lib/runner.js:276:5)
      at processImmediate [as _immediateCallback] (timers.js:330:15)

Trello Card

@nherment
Copy link
Author

this is happening when using seneca@0.5.17

@nherment
Copy link
Author

actually the stack trace is being modified by seneca. On the 3 lines that correspond to the test file, none match the line of the failing assert.

@rjrodger
Copy link
Collaborator

rjrodger commented Jul 9, 2014

0.5.18 leaves the stack alone
my bad

@rjrodger rjrodger closed this as completed Jul 9, 2014
@esnunes
Copy link

esnunes commented Jul 13, 2015

I'm trying to use seneca with mocha and chai. seneca seems to be intercepting the exception generated by chai.expect by doing that mocha can't identify that the test has failed and hangs till timeout.

Is there an alternative to disable seneca error handling on act callback?

@bitterulf
Copy link

I had the same Problem.
You need to put seneca into test mode.

it('should generate a error', function (done) {
    var s = require('seneca')({log: 'test'}).error(done);
    s.act({role: 'rules', action: 'apply'}, function(err, result) {
      assert.equal('a', 'b');
    });
});

Would be helpful if such things would appear on the website.

@bjonica
Copy link
Contributor

bjonica commented Sep 11, 2015

@bitterulf what do you do for negative tests -- such as a case where err is expected to exist?
@esnunes did you ever solve this issue?

@bitterulf
Copy link

@bjonica just check if the error exist

it('should generate a error', function (done) {
    var s = require('seneca')({log: 'test'}).error(done);
    s.act({role: 'rules', action: 'apply'}, function(err, result) {
      assert(err);
    });
});

@bitterulf
Copy link

@bjonica Hmm was not as easy as i thought but i got a sollution that worked for me.
It is not perfect because you just get a timeout if something is wrong.
But i can live with it.

var assert = require('assert');

var createSenecaInstance = function(cb) {
  var si = require('seneca')({
    log: 'silent'
  }).use(require('../plugins/rulePlugin.js'));
  si.ready( function( err ) {
    if (err) {
      return cb(err);
    }

    cb(null, si);
  });
};

describe('rulePlugin', function() {
  beforeEach(function(done){
    done();
  });

  describe('apply rules without entries', function () {
    it('should generate a error', function (done) {
      createSenecaInstance(function(err, si) {
        si.error(function(err) {
          if (err.msg == 'seneca: Action action:apply,role:rules failed: no entries.') {
            done();
          }
        });
        si.act({role: 'rules', action: 'apply' }, function(err, result) {
        });
      });
    });
  });
});

@bjonica
Copy link
Contributor

bjonica commented Sep 14, 2015

@bitterulf Yep, the timeout is exactly what I've been trying to fix. The ugly workaround I used to get better, faster errors was to wrap the act callback in a try-catch:

var check = function (test, done) {
  try {
    test();
    return done();
  catch (e) {
    return done(e);
  }
}

...

it('prints a better message', function(done) {
  si.act(action, function (err, result) {
    check(function () {
      expect(false).to.equal(true);    
    }, done);
  });
});

It's ugly, but I had no luck finding a better solution. Our issue seems to be related to #134 but I'm not sure. I've been hacking away at seneca.js to find a better way to deal with this.

@rjrodger
Copy link
Collaborator

0.6 error handling is a little too eager
will need to revisit for 0.7 to make this use case easier

@rjrodger rjrodger reopened this Sep 14, 2015
@bjonica
Copy link
Contributor

bjonica commented Sep 14, 2015

Thanks for giving it attention @rjrodger!

@rjrodger rjrodger removed the 0.7 line label Jan 12, 2016
@PhilWaldmann
Copy link

Still the same problem with 1.0.0

@mcdonnelldean
Copy link
Contributor

@rjrodger @geek Thoughts on this?

@PhilWaldmann
Copy link

If you use seneca with hapi (via chairo) you'll get a timeout for every exception happening on the server. By default hapi will return 500, but seneca swallows all exceptions.

I like the way seneca works, but this bug currently totally destroys all the benefits for me.

@geek
Copy link
Member

geek commented Feb 22, 2016

@PhilWaldmann agreed that we should handle that differently. Would rather it fails fast than times out

@mcdonnelldean
Copy link
Contributor

This is in progress now. Merged with #398

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

8 participants