2017-08-15 3 views
0

J'ai une petite application dans les rails 5. J'ai essayé d'utiliser Rspec pour le tester mais j'ai échoué avec le modèle readonly.Rspec test readonly modèle

J'ai readonly modèle Produit et modèle normal ProductMsp. Le second a est la liste de tous les prix associés au produit et est stocké dans la base de données Rails. Le produit est une connexion externe en lecture seule avec une autre base de données pour retirer la liste des produits.

J'ai ajouté l'association au produit à spec/factories/product_msps.rb.

FactoryGirl.define do 
    factory :product_msp do 
    product_id 11 
    initial_date '01-01-2017' 
    expiry_date '31-01-2017' 
    msp 9999.99 
    association :product 
    end 
end 

Je n'ai ajouté aucun nouveau test. Quand je lance rspec une fois de plus, j'ai des échecs. Probablement que rspec veut créer des produits, mais ne peut pas en raison de la table de base de données readonly.

Failures: 
    1) ProductMsp Validations initial_date cannot by empty 
    Failure/Error: pm = FactoryGirl.build(:product_msp, initial_date: nil)  
     ActiveRecord::ReadOnlyRecord: 
      Product is marked as readonly 
       # ./spec/models/product_msp_spec.rb:17:in `block (3 levels) in <top (required)>' 

Ci-dessous omet test: (il y a plus d'échecs)

require 'rails_helper' 

RSpec.describe ProductMsp, type: :model do 
    it 'initial_date cannot by empty' do 
     pm = FactoryGirl.build(:product_msp, initial_date: nil) 
     pm.valid? 
     expect(pm.errors[:initial_date]).to include("can't be blank") 
    end 
end 

spec/usines/products.rb

FactoryGirl.define do 
    factory :product do 
    id 11 
    name 'Porsche Cayenne' 
    end 
end 

et app/modèle/product.rb

class Product < ApplicationRecord 
    self.primary_key = 'tw_Id' 

    def readonly? 
    true 
    end 

    has_many :product_msps 

    default_scope {where(product_type:1).order(:name)} 

A la question principale est: Comment faire face à l'essai et les modèles en lecture seule?

  • Est-ce que rspec convient?

  • dois-je me débarrasser des tests modèles en lecture seule

Je recherche par internet, mais je ne trouve pas d'exemples de ce problème. J'ai besoin de construire une application au-dessus d'une autre base de données, mais j'aimerais la faire tester d'une manière ou d'une autre. :-)

+0

Avez-vous essayé d'ajouter 'skip_create' à votre usine' product'? Je suppose que cela devrait aider – Ngoral

+0

Merci beaucoup pour votre aide. C'était si facile. Je me suis concentré sur rspec, mais la solution n'était pas là. – rpeczykowski

Répondre

0

(Pour les futurs chercheurs :))

vous devez ajouter skip_create à votre usine pour le modèle de lecture seule. Cela permet d'éviter la création d'enregistrements de base de données et devrait résoudre le problème pour cela. C'est également utile si vous voulez créer une fabrique pour une classe, qui n'est pas connectée à la base de données (qui n'est pas héritée de `ActiveRecord :: Base).