2015-11-04 3 views
0

Приложение API Rails имеет два ресурса: статья (родительский элемент) и аннотация (дочерний элемент). Я хочу проверить, что, когда родитель создан, любые дети, если они указаны, также создаются. Поэтому я хочу протестировать это создание INSIDE для теста контроллера родителя, в дополнение к самому тестированию контроллера для ребенка.Rspec тест для тестирования создать контроллер вложенного ресурса внутри родительского ресурса

Я получил запрос JSON работать нормально, но я не уверен, как структурировать RSpec тест

{ 
    "article": { 
    "original_language": "ja", 
    "title": "日本のコンビニが中東で初めて店を開く", 
    "body": "コンビニの会社「セブン-イレブン・ジャパン」は13日、中東のUAE=アラブ首長国連邦のドバイに新しい店を開きました。日本のコンビニが中東に店を開くのは初めてです。\nUAEには24時間開いている店がほとんどありませんでした。このため、UAEの中のアブダビ首長国の王族(=王と王の親類)が新しいやり方の店を開いてほしいと頼んでいました。\n新しい店では、特に弁当やおにぎりなどを売りたいと考えています。UAEの人が好きなインドのスパイスを入れたり、大きなソーセージをのせたりしたおにぎりも作りました。新しい店の社長は「UAEにはいろいろな国の人たちが来ています。お客様がみんな喜ぶような店にしたいです」と話していました。\nセブン-イレブン・ジャパンは、これから3年でUAEに100の店を開く予定です。", 
    "source_name": "NHK Easy News", 
    "source_url": "http://www3.nhk.or.jp/news/easy/k10010269131000/k10010269131000.html", 
    "privacy_status": 1, 
    "scheduled_date": null, 
    "level": 3, 
    "annotations": [ 
     { 
     "destination_language": "en", 
     "authority_level": 1, 
     "source_text": "コンビニ", 
     "location_start": 1, 
     "location_end": 5, 
     "category": 0, 
     "definition": "Convenience Store", 
     "reading": null, 
     "translation": null, 
     "usage_note": "Convenience stores are everywhere in Japan. Most open 24/7. The big chains are 7/11, Lawson, Family Mart, Sunkus, and Circle K.", 
     "specific_note": null, 
     "paragraph_id": 1 
     }, 
     { 
     "destination_language": "en", 
     "authority_level": 1, 
     "source_text": "コンビニ", 
     "location_start": 1, 
     "location_end": 5, 
     "category": 0, 
     "definition": "Convenience Store", 
     "reading": null, 
     "translation": null, 
     "usage_note": "Convenience stores are everywhere in Japan. Most open 24/7. The big chains are 7/11, Lawson, Family Mart, Sunkus, and Circle K.", 
     "specific_note": null  } 
    ] 
    } 
} 

Вот моя попытка до сих пор. Я понимаю, что то, что я делаю, не вложенные аннотации в статью, как в JSON. Как я могу это сделать?

@article_attributes = create_prospective(scope: :article) 
@annotation_attributes_valid = create_prospective(scope: :annotation) 
@annotation_attributes_invalid = create_prospective(scope: :annotation, trait: :invalid) 
post :create, {user: @user.id, article: @article_attributes, annotations: @annotation_attributes_valid }, format: :json 

Примечание: create_prospective это вспомогательный метод для FactoryGirl

Контроллер

def create 
    @article = current_resource_owner.articles.build(article_params) 

    if @article.save 
     annotation_result = create_annotation(@article, params[:article][:annotations]) 

     render json: {article: @article, total_number_annotations: annotation_result[:total_count], number_annotations_succeeded: annotation_result[:success_count], number_annotations_failed: annotation_result[:failure_count], successful_annotations: annotation_result[:success_list], failed_annotations: annotation_result[:failure_list]}, status: annotation_result[:api_status] 
     # end 
    else 
     render json: { errors: @article.errors }, status: 422 
    end 

конец

Примечание: create_annotation опасение, что экономит аннотаций, для повторного использования в обоих контроллер изделия и контроллер аннотации

ответ

0

Ваши спецификации создают фактические объекты Article и Annotation вместо хэшей атрибутов, и, как вы сказали, вы не вложили Annotation внутри Article. Первое, что вам нужно сделать, это создать хэш-параметр, который вы можете проверить, с той же структурой, что и ваш рабочий JSON-запрос. Я бы ожидать, что выглядеть следующим образом:

article_data = attributes_for(:article, annotations: [attributes_for(:annotation)]) 

Затем, вы должны быть в состоянии размещать свои данные атрибутов правильно к контроллеру:

post :create, article: article_data, format: :json 

После того, как у вас есть спецификации работает, вы можете упростить ваш контроллер немного, используя accepts_nested_attributes_for на вашей модели Article. Rails обеспечивает это для всего этого случая, и это помогает вам проверять все ваши объекты сразу, если вы не хотите, чтобы Article был создан с недопустимым Annotation s, и он отлично играет с тем, как Rails делает nested forms

+0

Спасибо , Это работает как шарм. Мои создающие_проспективные помощники - это в основном те же атрибуты, что и для части. Но вложенность, о которой вы говорили, была недостающей частью. Благодаря! –

Смежные вопросы