Перемешивание mongoose.save () для разрешения `this` при вызове this.ave ()` - PullRequest
0 голосов
/ 14 марта 2019

Я пытаюсь написать модульные тесты для нашего приложения, которое использует mongoose.У меня есть экземпляры методов в модели, которые вызывают this.save()

Например.

MyModel.methods.update = function(data) {
    this.param = data
    this.save().then(updatedModel => {
        return updatedModel
    })
}

Есть ли способ заглушить сохранение мангуста, чтобы вернуть текущий this объект?

По сути, что-то вроде этого:

const save = sinon.stub(MyModel.prototype, 'save').resolves(this);

, но это ссылка на это в методе экземпляра.

Надеюсь, то, что я описал, имеет смысл.Любая помощь приветствуется.Спасибо!

1 Ответ

1 голос
/ 15 марта 2019

Из MDN this doc :

Когда функция вызывается как метод объекта, ее this устанавливается для объекта, метод которогоВызван.


В вашем примере кода save всегда вызывается как метод объекта MyModel, так что если вы заглушите save с помощью callsFake и передадите емуfunction, значение this в этом function будет MyModel объектом, к которому был вызван save:

// Returns a Promise that resolves to the MyModel object that save was called on
sinon.stub(MyModel.prototype, 'save').callsFake(function() { return Promise.resolve(this); });

Обратите внимание, что вышеуказанное будетне работает, если вы используете функцию стрелки , так как:

В функциях стрелки this сохраняет значение лексического контекста вмещающего this.

// Returns a Promise that resolves to whatever 'this' is right now
sinon.stub(MyModel.prototype, 'save').callsFake(() => Promise.resolve(this));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...