【问题标题】:NoMethodError: undefined method `assert_equal' with minitestNoMethodError:未定义的方法`assert_equal'与minitest
【发布时间】:2014-10-14 13:05:52
【问题描述】:

我在下面有用于自动化测试的测试结构。

#/project/class/Calculator.rb

require 'TestModule'
require 'MathOperation'

class Calculator
  include TestModule
  include MathOperation

  def initialize(num1, num2)
    @num1 = num1
    @num2 = num2
  end
end


#/project/methods/MathOperation.rb

module MathOperation
    def operation_addition
        addition = @num1 + @num2
        return addition
    end
end


#/project/methods/TestModule.rb

module TestModule
    def test_addition(value)
       assert_equal 25, value
    end   
end


#/project/tescases/TestCalculator.rb

require 'minitest/autorun'
require 'calculator'

class TestCalculator < Minitest::Test

  def setup
    @calc = Calculator.new(15, 10)
  end

  def test_proper_addition
    resolution = @calc.operation_addition
    @calc.test_addition(resolution)
  end
end

当我执行测试类 TestCalculator 时收到此错误。

NoMethodError: undefined method 'assert_equal' for #&lt;Calculator:0x00000002a77518 @num1=15, @num2=10

当我在 TestCalculator 类中使用 assert_equal 方法时,它起作用了。但是这种方式会在未来造成冗长的测试用例和冗余代码。如何在 minitest 类调用的模块中使用“断言”?是否可以?

【问题讨论】:

  • 我不明白你的设计,但我可以告诉你,你的测试代码应该和你的非测试代码完全解耦。例如。 Calculator 不应包含 TestModule
  • 我不确定你的解耦到底是什么意思。但是,如果我从Calculator 中删除TestModule,我将无法使用Calculator 对象从TestModule 调用方法。我的问题是模块TestModule 不能使用断言方法。但我不是红宝石专家,也许我的设计完全错误。

标签: ruby minitest assertions


【解决方案1】:

所有问题都来自您的TestModule 模块。该模块的含义只有在您查看所有其他代码以在上下文中理解它时才能清楚 - 这是对封装原则的公然违反。为什么值 25 很重要?当代码只是断言相等而不执行任何加法时,为什么该方法称为test_addition?完全删除该模块。

然后查看minitest documentation 中的示例以了解预期用途。让Calculator 做所有的工作,而TestCalculator 做断言:

# no testing code here, just functionality

module MathOperation
  def operation_addition
    addition = @num1 + @num2
  end
end

class Calculator
  include MathOperation

  def initialize(num1, num2)
    @num1 = num1
    @num2 = num2
  end
end

# and now we do all of the testing stuff

require 'minitest/autorun'

class TestCalculator < Minitest::Unit::TestCase
  def setup
    @calc = Calculator.new(15, 10)
  end

  def test_addition
    assert_equal 25, @calc.operation_addition
  end
end

【讨论】:

  • 这是否意味着在我的结构中不能使用模块作为测试部分?这是一个非常简单的例子,我想在其中描述我的问题。我想使用minitest 进行网页的自动化测试,如果我按照您的建议使用它,那么框架的维护将非常困难,并且测试用例将有很多行。所以我想将结果测试分成某些模块的特定方法。
  • 如果您愿意,您仍然可以将测试方法放在一个模块中,只需将该模块包含在 TestCalculator 而不是 Calculator 中。
  • 我在TestCalculator 中添加了“include TestMethod”,但现在有两个错误。第一个与我上面描述的相同,第二个是:TestCalculator#test_addition:ArgumentError: wrong number of arguments (0 for 1) 但我有适当数量的参数。
  • 我并不是说你可以简单地改变你的包含来让它工作。 首先 重构您的代码,使其看起来像我的答案。 然后您可以将test_addition 放入一个模块中并包含它。参数错误是因为以test_ 开头的方法对于 Minitest 来说是特殊的。不要命名一个方法,除非它是测试类的一部分(如我的回答)。
  • 我根据您的回答创建了结构,并且它有效。但是我在代码之后的问题中提到了它。这不是我正在寻找的解决方案。我想把我的具体代码发给你,可以吗?因为我觉得这种方式对于stackoverflow的使用来说是相当长的。因此,我会将您可能的解决方案留在这里。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-24
  • 1970-01-01
  • 2015-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多