`

MiniTest::Mock 二,进一步示例分析

阅读更多
据说,如果对mock stub 和fakes概念不熟悉的话可以看看这个 我自己看了一下,没懂。还是看例子容易些
例如,有这么个东西需要测试
class MailPurge
  def initialize(imap)
    @imap = imap
  end

  def purge(date)
    # IMAP wants dates in the format: 8-Aug-2002
    formatted_date = date.strftime('%d-%b-%Y')
  
    @imap.authenticate('LOGIN', 'user', 'password')
    @imap.select('INBOX')

    message_ids = @imap.search(["BEFORE #{formatted_date}"])
    @imap.store(message_ids, "+FLAGS", [:Deleted])
  end
end



我们的mock这样用

#相当于mock出一个imap对象有authenticate select等方法,重要是就一个ids是返回值有依赖
def test_purging_mail
  date = Date.new(2010,1,1)
  formatted_date = '01-Jan-2010'
  ids = [4,5,6]
  
  mock = MiniTest::Mock.new
  
  # mock expects:
  #            method      return  arguments
  #-------------------------------------------------------------
  mock.expect(:authenticate,  nil, ['LOGIN', 'user', 'password'])
  mock.expect(:select,        nil, ['INBOX'])
  mock.expect(:search,        ids, [["BEFORE #{formatted_date}"]])
  mock.expect(:store,         nil, [ids, "+FLAGS", [:Deleted]])
  
  mp = MailPurge.new(mock)
  mp.purge(date)
  
  assert mock.verify
end




如果,嫌不够的话,可以学一下mock的源代码


def initialize
  @expected_calls = {}
  @actual_calls = Hash.new {|h,k| h[k] = [] }
end
#用来记录实际调用的,后面用到



def expect(name, retval, args=[])
  n, r, a = name, retval, args # for the closure below
  @expected_calls[name] = { :retval => retval, :args => args }
  self.class.__send__(:define_method, name) { |*x|
    raise ArgumentError unless @expected_calls[n][:args].size == x.size
    @actual_calls[n] << { :retval => r, :args => x }
    retval
  }
  self
end
#如何完成mock的呢,expect的三个参数存起来,然后,参数和预期的返回值,存起来,这里比较技巧


def verify
  @expected_calls.each_key do |name|
    expected = @expected_calls[name]
    msg = "expected #{name}, #{expected.inspect}"
    raise MockExpectationError, msg unless
      @actual_calls.has_key? name and @actual_calls[name].include?(expected)
  end
  true
end
#验证

分享到:
评论
1 楼 helloqidi 2011-12-07  
谢谢,学习了

相关推荐

    Ruby单元测试框架TestUnit的替代者MiniTest介绍

    让我们看一个 MiniTest 的使用示例。首先,我们定义一个简单的 `HelloWorld` 类,它有一个返回 "Hello World!" 的方法: ```ruby class HelloWorld def get_word "Hello World!" end end ``` 接下来,我们可以...

    【小程序自动化Minium】一、框架介绍和环境搭建.doc

    二、环境搭建 环境搭建主要包括三个部分:Python 3.8 及以上、开发者工具、Minium框架的安装。 1. 安装Python 3.8 及以上 Python是基于Python语言的,因此需要安装Python 3.8 及以上版本。 2. 安装开发者工具 ...

    ruby-gem-test:测试宝石

    `rspec-mocks`和`minitest-mock`允许我们创建模拟对象和桩,以控制和模拟外部行为。 5. **测试覆盖率**:为了了解测试的全面性,我们可以使用如`simplecov`这样的Gem来测量代码覆盖率,确保大多数代码至少被一个...

    LearningRails:测试公共存储库

    此外,对于异步操作和模拟,Minitest和Capybara也是常用的测试工具。 1. **测试基础知识**: - **单位测试**:测试单个类或方法的行为。 - **集成测试**:测试多个组件如何协同工作。 - **功能测试**:模拟用户...

    test-multi-level

    这个名为“test-multi-level”的压缩包文件很可能包含了一组用于多层次测试的资源或代码示例,特别是与Ruby编程语言相关的测试框架和实践。Ruby以其简洁、灵活的语法和强大的测试支持而闻名,它内置了如RSpec、...

Global site tag (gtag.js) - Google Analytics