`

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  
谢谢,学习了

相关推荐

    minitest:minitest提供了一套完整的测试工具,支持TDD,BDD,模拟和基准测试

    `MiniTest::Mock`和`MiniTest::Mock#expect`方法可以用来创建和配置模拟对象。 6. **基准测试**:minitest的`MiniTest::Benchmark`模块支持基准测试,可以帮助开发者评估代码性能。 7. **颜色输出**:minitest在...

    minitest-reporters:创建可定制的MiniTest输出格式

    如果您想编写自己的报告程序,只需include Minitest::Reporter并覆盖您想要的方法即可。 查看提供的示例记者。 不喜欢默认的进度条记者吗? Minitest :: Reporters . use! Minitest :: Report

    minitest-firemock:使您的 MiniTest 模拟更具弹性

    MiniTest::FireMock 这个 gem 旨在使隔离测试更具弹性。 在独立测试中,FireMock 与普通模拟没有什么不同。 唯一的区别是在非隔离环境中调用测试的时间。 它检查模拟类上是否存在该方法,如果不存在则失败。 这为...

    minitest-spec-rails:使Rails使用MiniTest

    使Rails使用MiniTest :: Spec! minitest-spec-rails gem使您可以在现有的Rails 2.3、3.x或4.x测试套件中轻松使用MiniTest :: Spec DSL。 它通过强制ActiveSupport :: TestCase利用MiniTest :: Spec :: DSL来实现此...

    minitest-activemodel:用于ActiveModel的MiniTest匹配器

    然后,您必须将匹配器包含在Minitest::Test class Minitest::Test include MiniTest::Matchers::ActiveModel end 用法 查看以获取更多详细信息。 贡献 阅读。 执照 麻省理工学院许可证。 版权所有 2012 F

    pact-consumer-minitest:对Pact Consumer gem的Minitest支持

    Pact :: Consumer :: Minitest 为Minitest提供消费者支持。 安装 将此行添加到您的应用程序的Gemfile中: gem 'pact-consumer-minitest' 然后执行: $ bundle 或将其自己安装为: $ gem install pact-...

    nim-minitest:用于nim的minitest框架

    **nim-minitest:用于nim的minitest框架** nim-minitest是一个专门为Nim编程语言设计的测试框架,它借鉴了Python的minitest库的概念,为Nim开发者提供了简洁、高效的单元测试解决方案。Nim是一种静态类型、编译型的...

    test-unit-minitest:测试

    Test::Unit 的 minitest 包装器 在 Ruby 1.9 和 2.1 之间,Ruby 为 minitest 提供了一个包装器,以提供与 Ruby 1.8 相同的 Test::Unit 接口。 Ruby 2.2 附带了 Test::Unit 的捆绑 gem,但这不是包装器。 对包装好的 ...

    minitest-perf_regression:检测测试的性能下降

    Minitest :: PerformanceRegression 通过注释测试,分析其性能并检查自上次运行以来的性能回归。... extend Minitest::PerformanceRegression def test_thing assert true end check_performance_regression_on :

    minitest-hooks:Minitest的around和before_allafter_allaround_all挂钩

    MINITEST钩 minitest-hooks为Minitest添加了around和before_all / after_all / around_all钩子。 这使您可以执行以下操作,例如在数据库...您可以将某些规格的默认值设置为Minitest::HooksSpec : MiniTest :: Spec .

    minitest:用于Scala和Scala.js的超轻测试库

    **minitest:Scala和Scala.js的轻量级测试框架** `minitest` 是一个针对Scala编程语言及其JavaScript后端Scala.js设计的轻量级测试库。这个库的主要目标是提供简洁、快速且易于理解的测试工具,使得开发者在编写...

    minitest-parallel-db:与单个数据库并行运行测试

    Minitest::Parallel::Db 与单个数据库并行运行 Minitest。 基本原理 即使涉及数据库,我们也应该能够并行运行测试。 我们可以利用数据库事务来保持我们的测试相互隔离。 已经有解决方案,但有些需要创建多个数据库...

    rack-minitest:将处理 JSON 的便捷方法添加到机架测试和 MiniTest 规范样式匹配器以检查响应状态

    rack-minitest = rack-test + Minitest 。 看看我在那里做了什么? 这个 gem 为rack-test和Minitest添加了一些方便的方法,我发现自己为我编写的每个应用程序一遍又一遍地重复。 它添加了一些处理 JSON 的方法到...

    tdd-em-ruby-codigo-minitest:我的书“TDD em Ruby”的代码示例(http

    在提供的压缩文件 "tdd-em-ruby-codigo-minitest-master" 中,读者可以期待找到一系列示例代码,展示了如何在实际项目中应用这些TDD原则和Mini Test框架。这些示例可能包括创建测试、编写满足测试的最小功能代码,...

    mockical-creatures:用于使用模拟和存根进行测试的练习的 repo

    考虑一个神话般的矮人,它的公共 API 由一个方法组成: Dwarf#mine(mountain) 提供的山对象应该通过随机返回 3 个字符串之... 使用 Minitest 的内置Minitest::Mock库 ( Minitest::Mock ) 使用 Mocha gem(测试单元和

    guard-jruby-minitest:在没有启动成本的情况下在 JRuby 上保护 Minitest

    守卫-jruby-minitest 在 TDD 环境中使用时,Guard 一直是一个很好的生产力助推器。 然而,JRuby 使 TDD 变得更加困难,如果不是不可能的话。 这是因为默认情况下,每个run_on_modification或run_on_change启动一个...

    miniTest:测试

    在IT行业中,测试是软件开发过程中的重要环节,它确保了程序的质量和稳定性。Java作为广泛应用的编程语言,拥有丰富的测试...在深入研究"miniTest-master"的内容后,可以进一步提高测试技能,并将其应用到实际项目中。

    minitest-flog:Minitest 的 Flog 集成

    minitest-flog 打败你的代码,看看它流血的地方。 Flog 分析 Ruby 代码的复杂性迹象,...minitest-flog 引入了一个新的 Minitest::Flog::Test 类,您将使用它来对项目中的复杂性进行任何断言。 通过子类化 Minitest

    minitest-retry

    gem 'minitest-retry' 然后执行: $ bundle 或将其自己安装为: $ gem install minitest-retry 用法 在您的test_helper.rb文件中,添加以下行: require 'minitest/retry' Minitest :: Retry . use! 可以指定...

    minitest-pretty_diff:在 MiniTest 中比较它们之前漂亮地打印散列和数组

    minitest-pretty_diff Monkey-patches MiniTest::Assertions#mu_pp在比较它们之前漂亮地打印散列和数组。 这使得更容易发现嵌套结构之间的差异。用法只需要 gem,并像以前一样使用 MiniTest 的断言。前 MiniTest::...

Global site tag (gtag.js) - Google Analytics