RSpec测试使用gem对象作为实例变量的类

时间:2016-09-21 01:48:08

标签: ruby rspec

所以我对Rspec很陌生,我试图弄清楚如何为一个将对象作为构造函数参数并将该对象设置为实例变量的类编写测试。然后它在其他方法中调用该实例变量的对象方法。

示例:

class ClassA
  def initialize(string_object, gem_object)
    @instance_variable1 = gem_object
    @string = string_object
  end

  def check_validity?(some_arg)
    unless @instance_variable1.gemObjectMethod1.gemObjectMethod2(some_arg).empty?
      return true
    end
    false
  end
  ..
  ..
end

我对如何为此编写规范感到非常迷茫。对于一个我真的不明白指定构造函数实际需要什么。我意识到,我必须找到一些嘲弄或抄袭gem_object的方法,但我不确定如何。

对于下一个方法,我在这一点上尝试的是:

describe '#check_validity?' do
  context 'gets empty list' do
    let (:actual) { subject.check_validity?("sample") }
    before do
      allow(subject).to receive(@instance_variable1.gemObjectMethod1.gemObjectMethod2).with("sample").and_return([])
    end
    it 'returns false' do
      expect(actual).to be false
    end
  end
end

但这给了我与我的构造函数有关的错误,说它预期有2个参数,但是给出了0。

任何帮助将不胜感激!另外,我无法真正找到关于指定构造函数及其参数被模拟的内容。也许我正在寻找错误的地方,或者可能会遗漏一些明显的东西,因为这是我第一次体验BDD。

1 个答案:

答案 0 :(得分:1)

在RSpec中,'收到'是一种接受表示方法名称的符号的方法。 (它允许您链接一个接受预期参数列表的'方法。)要修复前块,您可以这样做:

return restaurants.find(item => {
   return item.restaurant.food == 'chicken'
})
然而,纯粹的丑陋表明出现了问题。它是。代码违反law of demeter非常糟糕,测试正在被吸引进去。

作为第一次清理它的尝试,你可能会考虑一种方法,即#c; caches"调用@ instance_variable1.gemObjectMethod1的结果。让我们说第一个方法返回一组可枚举的小部件。你可以改变你的课程,包括这样的内容:

before do
  allow(subject.instance_variable_get(:@instance_variable1).gemObjectMethod1).to receive(:gemObjectMethod2).with("sample").and_return([])
end

你的类仍然对gem对象有点过分了解,但是现在你已经把它分解了下来,你可以重构你如何找到小部件 - 可能是一个不同的gem或你自己的实现。出于测试目的,您可以通过模拟小部件将该决策与测试隔离开来。

def check_validity(a_string)
  widgets.gemObjectMethod2(a_string).empty?
end

private

def widgets
  @widgets ||= @instance_variable1.gemObjectMethod1
end