【问题标题】:Arbitrary mocking of object properties任意模拟对象属性
【发布时间】:2013-10-17 13:36:41
【问题描述】:

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

【问题讨论】:

  • method_missing 是做什么的?在这种情况下,它是用于返回属性的值还是空字符串?如果正确的话,你也许可以用 getter/setter 做一些事情。
  • 请查看我的问题的编辑版本。
  • 我已经更新了我的答案。我希望它有一些用处。

标签: javascript ruby mocking


【解决方案1】:

Javascript doesn't have an equivalent to method 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'

Fiddle.

希望这会有所帮助。

【讨论】:

  • 抱歉,我应该解释一下 ruby​​ 代码 - method_missing 是一个动态方法,当您尝试在未定义的对象上调用方法时会调用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-18
  • 1970-01-01
  • 2012-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多