Should.js 使用 containsDeep 比较对象的属性

Should.js compare Object's properties using containsDeep

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

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
}

我正在创建此 class 的共享实例,如下所示:

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 上定义的原型属性以允许此测试工作?

事实证明 deepContains 实际上工作得很好,但缺少的是我的子类中的初始化程序调用。

解决方法是调用superMyClass.call(self):

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