Should.js使用containsDeep比较Object的属性

时间:2015-11-24 19:11:31

标签: javascript node.js prototype mocha should.js

我有一个有几个属性的类,设置如下:

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)
})

为了使其更简洁和可扩展,我希望能够使用' containsDeep代替:

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

问题是SharedInstance上唯一存在的属性是initSharedInstance。我尝试过与SharedInstance.prototypeSharedInstance.constructor进行比较,但都没有效果。如何获取父MyClass上定义的原型属性以允许此测试工作?

1 个答案:

答案 0 :(得分:0)

事实证明deepContains实际上工作正常,但缺少的是我的子类中的初始化调用。

解决方案是调用超级MyClass.call(self)

var SharedInstance = {
    initSharedInstance: function(opts) {
        var self = this
        Object.setPrototypeOf(SharedInstance, new MyClass(opts))
        // this was missing:
        MyClass.call(self)
    }
}