RSpec: Как я могу сделать один тест shared_example, который тестирует много разных запросов PATCH контроллера, которые все обновляют разные атрибуты? - PullRequest
0 голосов
/ 28 августа 2018

У меня есть различные контроллеры, и у меня есть тесты для каждого из них, которые проверяют их действие обновления. Все тесты имеют одинаковую структуру: он проверяет, будет ли запрос на исправление обновлять и изменять объект, или нет. Единственное различие между этими тестами состоит в том, какие атрибуты проверяют проверки, чтобы увидеть их утверждение об изменениях. Эти атрибуты являются уникальными для контроллеров.

class CarsController 

def update
   # update attribute
   ...
end

end

и

class DogsController 

def update
   # update attribute
   ...
end

end

Мои тесты (еще 2):

CarsSpec 
describe "PATCH" do
  it "should update the car" do
    expect do 
      patch :update, id: object.id, data: {make: "honda"}
    end.to change {object.reload.make}
  end
end

DogSpec 
describe "PATCH" do
  it "should update the dog" do
    expect do 
      patch :update, id: object.id, data: {breed: "husky"}
    end.to change {object.reload.breed}
  end
end

Как вы видите, они представляют собой точно такую ​​же структуру тестов, поэтому, естественно, чтобы они были СУХИМЫМИ, я хочу выделить их в shared_example, чтобы они были СУХИМЫМИ. Идея состоит в том, чтобы иметь гораздо больше таких контроллеров, но только реальных тестов и чтобы эти контроллеры просто передавали в какое поле обновляться. Это будет включать что-то вроде

shared_example "update" do
  it "updates the object" do
    expect do 
      patch :update, id.object.id, data: { customField: "new value" }
    end.to change { object.reload.customField }
  end
end

Где в этом случае customField может быть либо размножен, либо изготовлен, и тест будет знать, как обновить эти поля, чтобы он был универсальным и мог применяться ко многим из этих контроллеров. Как мне достичь этого или что-то подобное?

1 Ответ

0 голосов
/ 28 августа 2018
Блок

shared_example принимает аргументы:

shared_example "update" do |custom_field|
  it "updates the object (field: #{custom_field})" do
    expect do 
      patch :update, id.object.id, data: { custom_field => "new value" }
    end.to change { object.reload.public_send(custom_field) }
  end
end

и назовите его

include_examples 'update', :make
include_examples 'update', :breed
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...