我来自Ruby背景,我正在尝试测试一个Javascript库,该库与检索到JSON api端点的对象进行交互。
如何在Javascript中重新创建以下Ruby?
class ArbitraryMock
def initialize(property_hash)
@property_hash = property_hash
end
def method_missing(*args)
@property_hash[args.first] || ''
end
end
编辑:method_missing是一种动态方法,只要方法不存在就会调用该方法。此方法的默认版本引发NoMethodError(Javascript将返回undefined我相信)。通过以上述方式覆盖方法,它允许您执行以下操作:
some_object = ArbitraryMock.new(foo: 'bar')
some_object.foo
=> 'bar'
some_object.bang
=> ''
答案 0 :(得分:0)
从Javascript doesn't have an equivalent to method missing开始,我能想到的唯一方法是使用getter和setter。
初始化参数。每个酒店都有一个吸气剂和二传手。 getter返回私有变量或空字符串的值; setter将私有变量设置为它所分配的值。
var params = {
get name() { return this._name ? this._name : ''; },
set name(name) { this._name = name; },
get dog() { return this._dog ? this._dog : ''; },
set dog(dog) { this._dog = dog; }
};
设置arbitraryMock对象并初始化。初始化方法将getter和setter固定到对象上。
var arbitraryMock = {
initialise: function (params) {
for (var k in params) {
this[k] = params[k];
}
}
};
arbitraryMock.initialise(params);
最初,测试name的值会返回一个空字符串。
console.log(arbitraryMock.name); // empty string
但是如果您为name
arbitraryMock.name = 'Basil Fawlty';
console.log(arbitraryMock.name); // 'Basil Fawlty'
这适用于您添加到对象的其他属性。
console.log(arbitraryMock.dog); // empty string
arbitraryMock.dog = 'Terrier';
console.log(arbitraryMock.dog); // 'Terrier'
希望这有点帮助。