对象扩展Scala特征。 Ruby相当于?

时间:2015-11-11 10:05:19

标签: ruby scala traits

在Scala中,我可以编写一个实现特征的单例对象。

trait Greeter {
  def greet = "Hello"
}
object MyGreeterObject extends Greeter

然后我可以很容易地在我的测试中模拟Greeter

var mockGreeter = new Greeter { 
  override def greet = "I'm a mock"
}

在Ruby中有相同的方法吗?最终,我希望能够模拟一些不需要状态的方法,并且最好通过对象级方法提供(在Scala中)。一旦我拥有了这个,我希望能够为我的测试进行模拟。

1 个答案:

答案 0 :(得分:5)

它在Ruby中称为Mixin,它由Modules实现。

module Greeter
  def greet
    'Hello'
  end
end

# extending a specific object
o = Object.new.extend(Greeter)
p o.greet

# creating a specific class
MyGreeter = Class.new.extend(Greeter)
p MyGreeter.greet

但Ruby中的模拟很简单。它不依赖于方式,构建对象。查看您最喜欢的Ruby测试框架的文档。

o = Object.new
o.expect(:greet, 'Hi, I am a mock')
p o.greet