使用笑话在猫鼬中预钩的单元测试用例

问题描述 投票:0回答:1

i AM试图编写用于预钩的单元测试用例。在控制台中传递文档时,我面临着检查this.isNew的问题,该文档打印为未定义。谁能告诉我这段代码有什么问题吗?

schema

// hooks callback
    export async function arrayCount(this: any, next: NextFunction) {
      if (this.isNew) {
        const parentArray = (this as any).parentArray();
        const maxSequence = parentArray.reduce((maximum: number, review: ReviewRatingType) => {
          if (review.review_rating_no) {
            const sequenceString = review.review_rating_no.match(/\d+/g);
            if (!sequenceString) {
              throw new Error('Invalid sequence in array.');
            }
            const sequenceNumber = parseInt(sequenceString.toString());
            if (sequenceNumber > maximum) {
              maximum = sequenceNumber;
            }
          }
          return maximum;
        }, 0);
        const sequence = 'RAT' + (maxSequence + 1 + '').padStart(3, '0');
        this.set({ review_rating_no: sequence });
      }
      next();
    }
    /**
     * Product Review Schema.
     */
    @singleton()
    export class ReviewRatingSchema extends AbstractSchema {
      isSubDocument = true;
      entityName = 'review_rating';
      schemaDefinition = {
        review_rating_user_id: {
          type: ObjectId,
          required: [true, 'review_rating_user_id is required'],
          ref: 'UserModel',
          unique: true,
        },
        review_rating_user_full_name: {
          type: String,
          trim: true,
          minlength: 3,
          maxlength: 20,
          validate: {
            validator: function (value: string) {
              return RegexConstants.betaRegex.test(value);
            },
            message: 'review_rating_user_full_name is invalid.',
          },
          required: [true, 'review_rating_user_full_name is required'],
        },
        review_rating_user_rating: {
          type: String,
          minlength: 1,
          maxlength: 1,
          validate: {
            validator: function (value: string) {
              return RegexConstants.rating.test(value);
            },
            message: 'review_rating_user_rating is invalid.',
          },
          required: [true, 'review_rating_user_rating is required'],
        },
        review_rating_description: {
          type: String,
          trim: true,
          minlength: 10,
          maxlength: 500,
          validate: {
            validator: function (value: string) {
              return RegexConstants.alphaRegex.test(value);
            },
            message: 'review_rating_description is invalid.',
          },
          required: [true, 'review_rating_description is required'],
        },
      };

      indexes = ['review_rating_user_id'];

      hooks = () => {
        // sequence for review rating
        this.schema?.pre('save', arrayCount);
      };
    }

测试用例

  describe('save hook', () => {
    it('should encrypt user password.', async () => {
      // Preparing
      const context = [
        {
          review_rating_status_is_active: false,
          review_rating_user_id: '5d5e6329a85f1a0ba718ceb3',
          review_rating_user_full_name: 'susdhassr',
          review_rating_modified_date: ' 2020-05-20T06:31:37.728Z',
        },
        {
          review_rating_status_is_active: false,
          review_rating_user_id: '5d5e6329a85f1a0ba718ceb5',
          review_rating_user_full_name: 'susdhassr',
          review_rating_modified_date: ' 2020-05-20T06:31:37.728Z',
        }
      ];
      for (let i in context){
        // console.log(context[i])
        await arrayCount.call(context[i], next);
      }
      // Verifying
      expect(next).toBeCalledTimes(2);
    });
  });
node.js mongoose jest
1个回答
0
投票

似乎您是在普通对象而不是猫鼬文档对象上调用pre钩子。普通对象将不会具有所有的猫鼬文档属性,例如isNew。试试这个:

await arrayCount.call(new ReviewRating(context[i]), next);

如果需要parentArray(),则可能需要从父文档对象中引用它。

const review = new Review({ ratings: [ /* your objects */ ] });
await arrayCount.call(review.ratings[i], next);
© www.soinside.com 2019 - 2024. All rights reserved.