Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在ruby with spec中测试具有扩展模块的类_Ruby On Rails_Ruby_Ruby On Rails 3_Ruby On Rails 3.2_Rubygems - Fatal编程技术网

Ruby on rails 如何在ruby with spec中测试具有扩展模块的类

Ruby on rails 如何在ruby with spec中测试具有扩展模块的类,ruby-on-rails,ruby,ruby-on-rails-3,ruby-on-rails-3.2,rubygems,Ruby On Rails,Ruby,Ruby On Rails 3,Ruby On Rails 3.2,Rubygems,我永远找不到这个用例的明确答案,如果这是重复的,我道歉。在下面的示例中,是否有一种干净的方法可以使用rspec测试类B中的方法是否被调用 module A def demo_method puts 1 end end class B extend A demo_method end 首先,将您的方法名称method修改为demo\u method,因为该名称是敏感的 然后 如果您确实需要知道类B正在调用一个方法,那么可以使用调用者方法。它将显示堆栈 您将获得这种类型的

我永远找不到这个用例的明确答案,如果这是重复的,我道歉。在下面的示例中,是否有一种干净的方法可以使用rspec测试类B中的方法是否被调用

module A
  def demo_method
    puts 1
  end
end

class B
  extend A
  demo_method
end

首先,将您的方法名称
method
修改为
demo\u method
,因为该名称是敏感的

然后


如果您确实需要知道类B正在调用一个方法,那么可以使用
调用者
方法。它将显示堆栈

您将获得这种类型的堆栈输出:

$: ruby
how-do-you-test-a-class-with-an-extended-module-in-ruby-with-spec.rb 
how-do-you-test-a-class-with-an-extended-module-in-ruby-with-spec.rb:10:in
`<class:B>'
how-do-you-test-a-class-with-an-extended-module-in-ruby-with-spec.rb:8:in `<main>' 1
how-do-you-test-a-class-with-an-extended-module-in-ruby-with-spec.rb:14:in
`<main>' 1

在调试级别,这些信息可以更好地作为日志中的零碎信息,而不是在屏幕上。但是我希望这能有所帮助。

想想你是否关心类B中的方法被调用(特异性),或者你是否关心行为或结果。只要输出1,并且该方法返回nil,那么它是类B的一部分还是从模块A派生的就不重要了,不是吗?我的实际例子是,在rails模型中,我希望确保调用这些方法。重要的是,他们确实会接到电话,并且有一些测试支持。您对此有什么建议吗?也许您应该简单地测试类的预期行为。假设你的方法做了些什么,所以你应该测试一下。测试“一个被调用的方法”会深入到实现细节中,IMO.@davogones它与rspec匹配器“it{should validate_presence_of(:name)}”有何不同?验证某个属性是否存在是类的一个行为,这在规范中很重要。您所描述的是什么(定义类时应该调用某个方法)听起来更像是类的内部工作,对消费者来说并不重要。因此我建议你测试方法的预期结果(公共行为),而不是测试方法是否被调用(私有实现细节)。问题是,它实际上并没有测试被调用的方法,它只是测试该方法是否在模块中定义。@ericraio,也许你可以使用
B。如果“看到类似puts 1的内容”
,一旦定义或调用类,被调用的方法(“类宏”)将立即执行。
$: ruby
how-do-you-test-a-class-with-an-extended-module-in-ruby-with-spec.rb 
how-do-you-test-a-class-with-an-extended-module-in-ruby-with-spec.rb:10:in
`<class:B>'
how-do-you-test-a-class-with-an-extended-module-in-ruby-with-spec.rb:8:in `<main>' 1
how-do-you-test-a-class-with-an-extended-module-in-ruby-with-spec.rb:14:in
`<main>' 1
module A
  def demo_method
    puts caller
    puts 1
  end
end

class B
  extend A
  demo_method
end

puts B::demo_method