2016-12-12 12 views
4

У меня возникла проблема с использованием методов базового класса с использованием 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(); 
}); 
}); 

ответ

6

Способы прототипа должны быть обрезаны/шпионированы непосредственно на прототипе:

sinon.stub(Actor.prototype,"GetMyDetails"); 
+0

Спасибо :), Другое сомнение, любая идея, почему значение this.Role приходит как неопределенные в этой строке routesLogger.logError (this.Role "GetMyDetails", ERR); в классе student.js? –

+0

Потому что 'this' не ссылается на экземпляр класса. Вместо 'function (err, result) {' следует использовать стрелку '(err, result) => {'. Btw, this.Role = role; 'избыточно в дочернем классе, это уже делается путем вызова' super (...) '. – estus