У меня возникла проблема с использованием методов базового класса с использованием Sinon. В приведенном ниже примере я завершаю вызов метода GetMyDetails базового класса следующим образом. Я уверен, что есть лучший способ.stubbing ES6 супер методы с использованием sinon
actor = sinon.stub(student.__proto__.__proto__,"GetMyDetails");
А также значение this.Role в конечном итоге не определено.
Я создал простой класс в JavaScript
"use strict";
class Actor {
constructor(userName, role) {
this.UserName = userName;
this.Role = role;
}
GetMyDetails(query,projection,populate,callback) {
let dal = dalFactory.createDAL(this.Role);
dal.PromiseFindOneWithProjectionAndPopulate(query, projection, populate).then(function (data) {
callback(null,data);
}).catch(function (error) {
routesLogger.logError(this.Role, "GetMyDetails", error);
return callback(error);
})
}
}
module.exports = Actor;
Теперь у меня есть дочерний класс, который расширяет Actor.js
"use strict";
class student extends Actor{
constructor(username, role) {
super(username, role);
this.UserName = username;
this.Role = role;
}
GetMyDetails(callback) {
let query = {'username': this.UserName};
let projection = {};
let populateQuery = {}
super.GetMyDetails(query, projection, populateQuery, function (err, result) {
if (err) {
routesLogger.logError(this.Role, "GetMyDetails", err);
callback(err, null);
}
else
callback(null, result);
});
}
}
Я пытался создать тестовый пример для этого, используя мокко
describe("Test Suite For Getting My Details",function(){
let request;
let response;
let actor;
beforeEach(function() {
request = {
session: {
user: {
email: '[email protected]',
role: 'student'
}
},
originalUrl:'/apssdc'
};
response = httpMocks.createResponse();
});
afterEach(function() {
});
it("Should get details of the student",function(done){
let username = "student";
let role = "Student";
let student = new Student(username,role);
actor = sinon.stub(student.__proto__.__proto__,"GetMyDetails");
actor.yields(new Error(), null);
sc.GetMyDetails(function(err,data){
console.log(data);
console.log(err);
});
done();
});
});
Спасибо :), Другое сомнение, любая идея, почему значение this.Role приходит как неопределенные в этой строке routesLogger.logError (this.Role "GetMyDetails", ERR); в классе student.js? –
Потому что 'this' не ссылается на экземпляр класса. Вместо 'function (err, result) {' следует использовать стрелку '(err, result) => {'. Btw, this.Role = role; 'избыточно в дочернем классе, это уже делается путем вызова' super (...) '. – estus