【问题标题】:using kind_of? with Rspec in Ruby使用 kind_of?在 Ruby 中使用 Rspec
【发布时间】:2014-09-22 15:47:05
【问题描述】:

我正在尝试测试此方法,该方法只能将整数作为参数,但我无法使其工作;很遗憾。 谢谢你的时间。 我不明白这个错误日志:

1) DownloadingData interval_data 以2个整数作为参数设置时间间隔 失败/错误:bag.should_receive(:interval_data).with(2, kind_of(Numeric), kind_of?(Numeric), 2) (#).interval_data(2, #, false, 2) 预期:1 次带参数:(2, #, false, 2) 收到:0 次,参数:(2, #, false, 2)

我的代码:

class DownloadingData

  attr_accessor :today

  def initialize
    @today = Date.today
  end

  def interval_data(point_a, point_b)
    start_point = @today - point_a
    end_point  = @today + point_b
    (start_point..end_point).each do |week_day|
      puts week_day #checking the week day
    end
  end
end

我的测试:

describe DownloadingData do
   let(:bag) { DownloadingData.new }

  describe 'interval_data' do
    it 'responds to interval_data' do
      expect(bag).to respond_to(:interval_data)
    end
    it 'takes 2 integers as parameters to set up the time-interval' do
      bag.should_receive(:interval_data).with(2, kind_of(Numeric), kind_of?(Numeric), 2)
    end
end

【问题讨论】:

  • 你可能不想在这里使用 should_receive。而是调用该方法并指定返回值应该是什么(或应该发生什么副作用)

标签: ruby rspec


【解决方案1】:

首先你必须实际使用statintg之后的方法,它应该被接收,否则它不会被接收。 receive 检查方法是否实际与存根一起使用。这就是为什么他说他收到了 0 次。 RSPEC expect message

在这里你可以看到如何使用 with:matching arguments

试试这个:

it 'takes 2 integers as parameters to set up the time-interval' do
  expect(bag).to receive(:interval_data).with(kind_of(Numeric), kind_of(Numeric)).and_call_original
  bag.interval_data(1, 2)
end

虽然这只会验证使用 2 个数字调用您的方法不会导致异常。

【讨论】:

  • 虽然该规范并没有真正做任何事情
  • 它验证了 interval_data 方法运行时没有错误,有 2 个数字。没有必要像那样测试它,但这就是要求的。
  • @ascar 你好!感谢您的回复!你说:“真的没有必要像那样测试它”那将如何测试呢?谢谢!
  • 测试正确类型的输入只有在从另一个方法中动态调用此方法时才有意义,并且您希望确保代码在其他方法发生更改时正常工作。如果方法没有抛出异常,我提供的规范将始终有效,因为我在规范期间明确提供了工作输入。 expect{bag.interval_data(1, 2)}.not_to raise_error 会做同样的事情。
  • @ascar 方法调用被 receive 使用 - 原始实现未经测试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-21
  • 2013-04-13
  • 1970-01-01
  • 1970-01-01
  • 2017-03-04
  • 2018-02-21
  • 1970-01-01
相关资源
最近更新 更多