当前位置: 首页 > 面试题库 >

rspec:如何测试redis#subscribe代码?

卢恩
2023-03-14
问题内容

给出类似的东西:

class MyClass
  def subscribe
    $redis.subscribe('channel') do |on|
       on.message do |channel, msg|
         Something.create(msg)
       end
    end
  end
end

如何测试MyClass执行subscribe时它将Something.create针对通道上收到的每条消息运行?


问题答案:

您拥有的这段代码不是很容易测试。首先,绝对要摆脱这个全局$redis变量。相反,在构造函数中接受redis实例。

class MyClass
  attr_reader :redis

  def initialize(redis)
    @redis = redis
  end

  def subscribe
    redis.subscribe('channel') do |on|
       on.message do |channel, msg|
         Something.create(msg)
       end
    end
  end
end

然后在测试中,您可以制作一个完全可以控制但与您使用的api一致的虚拟redis。遵循以下原则:

class DummyRedis
  def subscribe(&block)
    @block = block
  end

  def trigger_on
    @block.call make_on_message
  end
end


fake_redis = DummyRedis.new

expect {
  mc = MyClass.new(fake_redis)
  mc.subscribe
  fake_redis.trigger_on
}.to change{Something.count}.from(0).to(1)

这种很酷的技术称为“依赖注入”(或者像某些人所说的那样,“将参数传递给构造函数”)。



 类似资料:
  • 我有一个控制器方法,它使用<code>redirect_to:back<code>将用户重定向回原始页面。方法如下所示。 我试图为有效和无效的创建方法编写一个集成测试。下面给出了集成测试。 我得到以下与。 我尝试在创建方法中使用HTTP REFERRER(如下所述)而不是redirect_to:back,但我仍然收到错误。 我不确定我需要改变什么来通过redirect_to :back的测试。我曾

  • 问题内容: 控制器中包含以下内容: 规格: 但这不起作用: 我看到“保存文件”对话框,但显然不是“警告”对话框。 如何单击确定并让水豚看到数据? 问题答案: 改编自CollectiveIdea和其他来源。 在OSX上工作。Firefox 34.0.5 规格: 规范助手: 共享/download_helper.rb:

  • Rspec尝试在运行任何规范文件或整个测试套件的末尾运行测试::单元测试。它仍然可以,因为我没有任何测试单元测试文件,但它尝试将给定给rspec的命令行选项传递给test::unit,结果是 如何阻止rspec运行测试单元测试? 我正在使用的测试gem版本是

  • 我已经在我的Rails4应用程序中实现了JQuery文件上传。当我从浏览器手动测试文件上传时,文件上传工作正常,但测试失败。 下面是我上传JQuery文件的规范:需要'spec\u helper' 我使用rspec2、水豚2和恶灵来实现这个特性规范。

  • 这个问题告诉我如何从RSpec模型和控制器规范测试记录器语句。不幸的是,它似乎不适用于功能规范。使用以下代码: 我得到一个错误: 文件不包含,因此在控制器操作有机会完成之前,测试似乎立即失败。 有没有办法在功能规范中使用这种语法?

  • 问题内容: CPU周期,内存使用率,执行时间等? 补充:除了感知代码运行的速度之外,还有定量的测试JavaScript性能的方法吗? 问题答案: 探查器绝对是获取数字的好方法,但是根据我的经验,感知的性能对用户/客户端至关重要。例如,我们有一个带有Ext手风琴的项目,该项目已扩展为显示一些数据,然后显示一些嵌套的Ext网格。实际上,所有内容的渲染速度都非常快,一次操作都不需要很长时间,一次渲染的信