2012-01-31 1 views
1

Я пытаюсь издеваться над массивом в rspec (в приложении это объект возврата из внешнего API), но я не знаю, как это сделать.Как издеваться над массивом в rSpec?

Я попытался насмешливым это так:

item = double("item") 
item.stub(:[]) { :return_value } 

, который работает, но тогда я буду получать: return_value для каждого значения в массиве. Есть ли другой способ?

+1

Я знаю, что решение заключается в том, чтобы обернуть возвращаемый объект из API в оболочку, а затем издеваться над ним, но я пытаюсь его избежать. – Indigon

ответ

6

Я думаю, вам не нужно создавать тестовые двойники для массива, они добавят ненужное усложнение кода ваших тестов. Вы можете просто создать поддельный массив и использовать его позже:

items = [:return_value1, :return_value2] 

В случае, если вам нужно окурок метод и возвращать разные результаты для первого и последующих вызовов, вы можете сделать это:

obj.stub(:method).and_return('1', '2') 

В этом case obj.method вернет '1', когда он будет вызван в первый раз, и вернет '2' для всех последующих вызовов.

Кроме того, насколько вы используете блок для заглушки, вы можете динамически вычислять возвращаемое значение в этом блоке. Но это считается не очень хорошей практикой, потому что идиоматично заглушки должен возвращать статические данные.

obj.stub(:method) { Time.now } 
+0

duh, не думал про самый простой способ просто создать массив. благодаря – Indigon