2015-11-24 3 views
-1

У меня есть класс, который имеет несколько свойств, устанавливается следующим образом:Should.js сравнить свойства Объекта с использованием containsDeep

var MyClass = function(opts) { 
    var self = this 

    // orgId and appId are required 
    self.orgId = ok(arguments).getIfExists('0') || ok(opts).getIfExists('orgId') || ok(config).getIfExists('orgId') 
    self.appId = ok(arguments).getIfExists('1') || ok(opts).getIfExists('appId') || ok(config).getIfExists('appId') 

    ... etc. 

    return self 
} 

Я создаю общий экземпляр этого класса, как так:

var SharedInstance = { 
    initSharedInstance: function(opts) { 
     Object.setPrototypeOf(SharedInstance, new MyClass(opts)) 
    } 
} 

Это работает довольно хорошо.

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

it('SharedInstance\'s properties should match those defined in config.json', function() { 
    SharedInstance.orgId.should.equal(config.orgId) 
    SharedInstance.appId.should.equal(config.appId) 
    SharedInstance.clientId.should.equal(config.clientId) 
    SharedInstance.clientSecret.should.equal(config.clientSecret) 
    SharedInstance.baseUrl.should.equal(config.baseUrl) 
    SharedInstance.tokenTtl.should.equal(config.tokenTtl) 
    SharedInstance.authFallback.should.equal(config.authFallback) 
}) 

Чтобы сделать это более кратким и масштабируемым, я хотел бы быть в состоянии использовать «s containsDeep вместо:

it('SharedInstance\'s properties should match those defined in config.json', function() { 
    SharedInstance.should.deepContains(config) 
}) 

проблема заключается в том, что единственное свойство, которое существует на SharedInstance непосредственно является initSharedInstance. Я пробовал по сравнению с SharedInstance.prototype и SharedInstance.constructor, но не работает. Как я могу захватить свойства прототипа, определенные на родительском MyClass, чтобы разрешить этот тест?

ответ

0

Решение назвать супер MyClass.call(self):

var SharedInstance = { 
    initSharedInstance: function(opts) { 
     var self = this 
     Object.setPrototypeOf(SharedInstance, new MyClass(opts)) 
     // this was missing: 
     MyClass.call(self) 
    } 
} 
Смежные вопросы