简体   繁体   中英

MeteorJS: How to stub validated method in unit test

I am using validated methods ( mdg:validated-method ) with LoggedInMixin ( tunifight:loggedin-mixin ).

Now I have a problem with my unit tests, as they fail with notLogged error, because in the unit tests there is no logged user of course. How do I have to stub that?

method

const resetEdit = new ValidatedMethod({
  name: 'reset',
  mixins: [LoggedInMixin],
  checkLoggedInError: { error: 'notLogged' }, // <- throws error if user is not logged in
  validate: null,

  run ({ id }) {
    // ...
  }
})

unit test

describe('resetEdit', () => {
  it('should reset data', (done) => {
    resetEdit.call({ id: 'IDString' })
  })
})

Unit tests throws Error: [notLogged] .

Edit:

validated-method has a built-in way of providing a context and it is documented in the README , exactly for cases like the one in your question.

method#_execute(context: Object, args: Object)

Call this from your test code to simulate calling a method on behalf of a particular user:

( source )

  it('should reset data', (done) => {
      resetEdit._execute({userId: '123'}, { id: 'IDString' });
      done();
  });

Original answer:

I believe that this can be achieved using the DDP._CurrentMethodInvocation meteor environment variable.

If you run the test in a scope where the its value is an object a userId string, it will be merged with the rest of the method invocation context object and the mixin will not fail.

describe('resetEdit', () => {
  it('should reset data', (done) => {
    DDP._CurrentMethodInvocation.withValue({userId: '123'}, function() {
      console.log(DDP._CurrentInvocation.get()); // {userId: '123'}
      resetEdit.call({ id: 'IDString' });
      done();
    })
  });
})

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM