首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >红宝石测试方法的覆盖检测

红宝石测试方法的覆盖检测
EN

Stack Overflow用户
提问于 2009-02-19 23:03:48
回答 6查看 773关注 0票数 3

如果您编写一个测试类,如

代码语言:javascript
复制
class MyTest < Test::Unit::TestCase 
  def setup 
  end

  def test_1 
    flunk
  end

  def test_1 
    assert true
  end
end

第一个test_1被忽略。虽然这看起来是个愚蠢的错误,但它可能发生在复制和粘贴编程中。除了跑步

代码语言:javascript
复制
grep test test_me.rb | wc

与有多少测试单元表示已经运行,或者使用rcov或heckle,或者使用-w运行的测试单元相比,如何才能检测到这些问题?

另外,是否有任何方法来指定不应该覆盖测试方法?

编辑:正在测试的方法有一个参数,其值为6个左右,测试人员希望测试每个场景。这就是为什么使用复制和粘贴编程。对于这种情况,我能设想的唯一选择是一个参数和期望值的六元素数组。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-02-20 17:44:07

您可以利用Ruby的method_added,只要将方法添加到类中,就会调用它。您应该能够将某些内容放入您包含的模块中,但这里有一个在测试类中执行该操作的简单示例。

代码语言:javascript
复制
class MyTest < Test::Unit::TestCase

  @@my_tests = []

  def self.method_added(sym)
    raise "#{sym} already defined!" if @@my_tests.include? sym
    @my_tests << sym
  end

  def test_foo_1
  end

  def test_foo_2
  end

  def test_foo_1
  end
end
票数 5
EN

Stack Overflow用户

发布于 2009-02-21 10:00:58

编辑:正在测试的方法有一个参数,有大约6个可能的值,测试人员希望测试每个场景。这就是为什么使用复制和粘贴编程。

在这种情况下,我这样做:

代码语言:javascript
复制
def test_foo
  test_cases = [
   {:param => 1, :expected => 'whatever is expected'},
   {:param => 2, :expected => 'whatever is expected'},
   {:param => 3, :expected => 'whatever is expected'},
   {:param => 4, :expected => 'whatever is expected'},
   {:param => 5, :expected => 'whatever is expected'},
   {:param => 6, :expected => 'whatever is expected'}
  ]

  for test_case in test_cases
    do_the_test(test_case)
  end
end

def do_the_test(test_case)
  # test code here
end

这完全避免了复制和粘贴,正如已经说过的,这是不好的。

对于这种情况,我能设想的唯一选择是一个参数和期望值的六元素数组。

一点儿没错!

票数 2
EN

Stack Overflow用户

发布于 2009-02-21 12:32:20

关于HermanD的答案,因为这是Ruby!,所以您也可以在类中直接这样做,以创建唯一的测试方法:

代码语言:javascript
复制
class MyObjectTest < Test::Unit::TestCase
  [
   {:param => 1, :expected => 'whatever is expected'},
   {:param => 2, :expected => 'whatever is expected'},
   {:param => 3, :expected => 'whatever is expected'},
   {:param => 4, :expected => 'whatever is expected'},
   {:param => 5, :expected => 'whatever is expected'},
   {:param => 6, :expected => 'whatever is expected'}
  ].each do |test_case|
    define_method :"test_using_#{test_case[:param]}_should_return_#{params[:expected].underscore}" do
      assert_equal test_case[:expected], MyObject.new.do_something_with(test_case[:param])
    end
  end
end

使用Rspec(或Shoulda's)语句更自然一些,就像语言一样:

代码语言:javascript
复制
describe MyObject do
   [
   {:param => 1, :expected => 'whatever is expected'},
   {:param => 2, :expected => 'whatever is expected'},
   {:param => 3, :expected => 'whatever is expected'},
   {:param => 4, :expected => 'whatever is expected'},
   {:param => 5, :expected => 'whatever is expected'},
   {:param => 6, :expected => 'whatever is expected'}
  ].each do |test_case|
    it "should return #{test_case[:expected]} when using #{test_case[:param]}" do
      MyObject.new.do_something_with(test_case[:param]).should == test_case[:expected]
    end
  end
end
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/567660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档