2

Mongoose モデルの仮想属性をスタブする方法はありますか?

Problemはモデル クラスでありdifficulty、仮想属性であると想定します。delete Problem.prototype.difficultyfalse を返し、属性はまだそこにあるため、必要な値に置き換えることはできません。

私も試しました

var p = new Problem();
delete p.difficulty;
p.difficulty = Problem.INT_EASY;

うまくいきませんでした。

undefined を代入Problem.prototype.difficultyまたは使用sinon.stub(Problem.prototype, 'difficulty').returns(Problem.INT_EASY); すると、「TypeError: Undefined のプロパティ 'スコープ' を読み取れません」という例外がスローされます。

  var p = new Problem();
  sinon.stub(p, 'difficulty').returns(Problem.INT_EASY);

「TypeError: 文字列プロパティの難しさを関数としてラップしようとしました」というエラーがスローされます。

アイデアが不足しています。手伝ってください!ありがとう!

4

2 に答える 2

3

mongooseは内部的 Object.definePropertyにすべてのプロパティを使用します。これらは構成不可として定義されているため、削除することも、再構成することもできません。

ただし、できることは、プロパティの取得と設定に使用されるモデルのメソッドgetとメソッドを上書きすることです。set

var p = new Problem();
p.get = function (path, type) {
  if (path === 'difficulty') {
    return Problem.INT_EASY;
  }
  return Problem.prototype.get.apply(this, arguments);
};

または、sinon.js を使用した完全な例:

var mongoose = require('mongoose');
var sinon = require('sinon');

var problemSchema = new mongoose.Schema({});
problemSchema.virtual('difficulty').get(function () {
  return Problem.INT_HARD;
});

var Problem = mongoose.model('Problem', problemSchema);
Problem.INT_EASY = 1;
Problem.INT_HARD = 2;

var p = new Problem();
console.log(p.difficulty);
sinon.stub(p, 'get').withArgs('difficulty').returns(Problem.INT_EASY);
console.log(p.difficulty);
于 2013-09-14T21:12:55.373 に答える