0

我来自 Ruby 背景,正在尝试测试与检索到 JSON api 端点的对象交互的 Javascript 库。

我将如何在 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
=> ''
4

1 回答 1

0

由于Javascript 没有与方法 missing等效的方法,因此我能想到的唯一方法是使用 getter 和 setter。

初始化参数。每个属性都有一个 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; }
};

设置任意Mock 对象并初始化。初始化方法将 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'

小提琴

希望这有所帮助。

于 2013-10-17T14:34:04.363 回答