const User = attributes({
name: { type: String, required: true },
age: { type: Number, required: true },
const user = new User({ age: 42 });
// passes, because name is invalid
expect(user).toHaveInvalidAttributes([{ path: ['name'] }]);
// fails, because age is valid
expect(user).toHaveInvalidAttributes([{ path: ['age'] }]);
// fails, because name is invalid but age is valid
expect(user).toHaveInvalidAttributes([{ path: ['name'] }, { path: ['age'] }]);
// passes, because name is invalid with this message
expect(user).toHaveInvalidAttributes([{ path: ['name'], messages: ['"name" is required'] }]);
// fails, because name is invalid but not with this message
expect(user).toHaveInvalidAttributes([{ path: ['name'], messages: ['"name" is not cool'] }]);
// passes. Notice that you can even use arrayContaining to check for a subset of the errros
expect(user).toHaveInvalidAttributes([
{ path: ['name'], messages: expect.arrayContaining(['"name" is required']) },
// passes. And stringContaining can be used as well
expect(user).toHaveInvalidAttributes([
{ path: ['name'], messages: [expect.stringContaining('required')] },