如何在rSpec中模拟数组?

Ind*_*gon 3 ruby unit-testing rspec ruby-on-rails rspec-rails

我试图在rspec中模拟一个数组(在应用程序中它是来自外部API的返回对象),但我不知道如何.

我试着像这样嘲笑它:

item = double("item")
item.stub(:[]) { :return_value }
Run Code Online (Sandbox Code Playgroud)

哪个有效,但后来我会得到:数组中每个值的return_value.还有另外一种方法吗?

Ali*_*kau 8

我认为你不需要为数组生成测试双精度,它们会给测试代码增加不必要的复杂性.你可以创建假数组并在以后使用它:

items = [:return_value1, :return_value2]
Run Code Online (Sandbox Code Playgroud)

如果您需要存根方法并为第一次和后续调用返回不同的结果,您可以这样做:

obj.stub(:method).and_return('1', '2')
Run Code Online (Sandbox Code Playgroud)

在这种情况下obj.method,第一次调用时返回"1",后续调用返回"2".

此外,就使用块存根而言,您可以动态计算此块中的返回值.但这被认为不是很好的做法,因为惯用的存根应该返回静态数据.

obj.stub(:method) { Time.now }
Run Code Online (Sandbox Code Playgroud)