如何在ruby中模拟模块中的方法?

Jas*_*Jas 1 ruby unit-testing mocking

我有number_module.rb内容:

def power2(x)
  x * x
end
Run Code Online (Sandbox Code Playgroud)

和测试用例tc_number.rb:

require_relative('number_module')
require "test/unit"
require 'mocha/test_unit'

class TestSimpleNumber < Test::Unit::TestCase

  def test_simple
    assert_equal(4, power2(2) ) # how to mock power2 to return 3?
  end

end
Run Code Online (Sandbox Code Playgroud)

为了练习嘲笑我想在测试用例中模拟power2 3而不是powering by 2我怎么能这样做?

Eri*_*nil 5

文档中看起来你可以使用expects(:method_name).returns(result):

def power2(x)
  x * x
end
require "test/unit"
require 'mocha/test_unit'

class TestSimpleNumber < Test::Unit::TestCase
  def test_simple
    expects(:power2).returns(3)
    assert_equal(4, power2(2) )
  end
end
Run Code Online (Sandbox Code Playgroud)

测试按预期失败:

Loaded suite mocha
Started
F
=============================================================================================================================================================
Failure: test_simple(TestSimpleNumber)
mocha.rb:10:in `test_simple'
      7: class TestSimpleNumber < Test::Unit::TestCase
      8:   def test_simple
      9:     expects(:power2).returns(3)
  => 10:     assert_equal(4, power2(2) ) # how to mock power2 to return 3?
     11:   end
     12: end
<4> expected but was
<3>
Run Code Online (Sandbox Code Playgroud)