任意模拟对象属性

时间:2013-10-17 13:36:42

标签: javascript ruby mocking

我来自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
=> ''

1 个答案:

答案 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'

Fiddle

希望这有点帮助。