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)
})
为了使这个更加简洁和可扩展,我希望能够使用 should.js 的 containsDeep
来代替:
it('SharedInstance\'s properties should match those defined in config.json', function() {
SharedInstance.should.deepContains(config)
})
问题是 SharedInstance
上直接存在的唯一 属性 是 initSharedInstance
。我试过与 SharedInstance.prototype
和 SharedInstance.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)
}
}
我有一个 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)
})
为了使这个更加简洁和可扩展,我希望能够使用 should.js 的 containsDeep
来代替:
it('SharedInstance\'s properties should match those defined in config.json', function() {
SharedInstance.should.deepContains(config)
})
问题是 SharedInstance
上直接存在的唯一 属性 是 initSharedInstance
。我试过与 SharedInstance.prototype
和 SharedInstance.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)
}
}