Тестирование проверки уникальности поля в модели Rails с использованием rspec без вспомогательных гемов - PullRequest
0 голосов
/ 17 мая 2018

Я пытаюсь написать тест для проверки уникальности поля в модели RoR.

Я работаю над приложениями Ruby on Rails, которые я использую для отработки своих навыков в TDD.До сих пор я использовал Интернет в качестве своего ресурса.Я пишу тестирование на валидацию для модели. Я не буду использовать гемы 'musta', 'FactoryGirl' (и т. Д.).Я знаю, что использование этих драгоценных камней сэкономит мне много кода, но в конечном итоге я буду использовать эти драгоценные камни.Я хочу научиться писать тест rspec самостоятельно без гемов, чтобы помочь мне понять, как писать тестирование.До сих пор у меня все хорошо, пока не тестируется уникальность.

Как создать тест для проверки уникальности поля 'email' в модели 'User' без использования 'musta', 'FactoryGirl' (и т. Д.) драгоценные камни.Я знаю, что использование этих драгоценных камней сэкономит много кода, но в конечном итоге я буду использовать эти драгоценные камни.Я хочу научиться писать тест rspec самостоятельно без гемов, чтобы помочь мне понять, как писать тестирование.

Большинство «ответов» на эти вопросы в Stackoverflow (и в других местах в сети) включают использование этихвспомогательные камни.Но не найти ответа на этот вопрос без драгоценных камней.

Вот модель, User.rb `` `

class User < ApplicationRecord
  validate: :name, :email, presence: true
  validates :name, length: { minimum: 2 }
  validates :name, length: { maximum: 50 }
  # validates_format_of :email, with: /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i
  validates :email, format: { with: /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i, on: :create }
  validates :email, uniqueness: true
end

And here is `user_spec.rb`.

require 'rails_helper'

RSpec.describe User, type: :model do
  subject {
    described_class.new(name: 'John', email: 'john@home.xyz')
  }

  describe 'Validation' do
    it 'is valid with valid attributes' do
      expect(subject).to be_valid
    end

    it 'is not valid without name' do
      subject.name = nil
      expect(subject).to_not be_valid
    end

    it 'is not valid without email' do
      subject.email = nil
      expect(subject).to_not be_valid
    end

    (...)

    it 'is invalid if the email is not unique' do
      expect(????????).to_not be_valid
    end

  end
end

` ``

как мне написать, чтобы проверить уникальность.Должен ли я использовать что-то другое, кроме предмета для проверки?Помните, я не хочу, чтобы в этот раз использовались гемы (Shoulda / FactoryGirl / etc).

Я занимался этим последние несколько дней, и не повезло.Любое решение?А где лучший учебник по rspec для Ruby on Rails?

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Хорошо, я все заработал. Хорошо, по предложению @Jagdeep Singh я написал этот тест:

`` `

context 'when email is not unique' do
  before { described_class.create!(name: 'foo', email: 'john@home.xyz') }
  it {expect(subject).to be_invalid}
end

context 'when email is unique' do
  before { described_class.create!(name: 'foo', email: 'jane@home.xyz') }
  it {expect(subject).to be_valid}
end

`` ` и, кажется, пройти тест. Я добавил другой тест для проверки действительной уникальности. Спасибо за помощь.

Я решил переписать весь тест, чтобы использовать context, чтобы сделать его более понятным и читаемым. Вот мой переписать:

# frozen_string_literal: true

require 'rails_helper'

RSpec.describe User, type: :model do
  subject {
    described_class.new(name: 'John', email: 'john@home.xyz')
  }

  describe '.validation' do



    context 'when email is not unique' do
      before { described_class.create!(name: 'foo', email: 'john@home.xyz') }
      it {expect(subject).to be_invalid}
    end

    context 'when email is  unique' do
      before { described_class.create!(name: 'foo', email: 'jane@home.xyz') }
      it {expect(subject).to be_valid}
    end

  end
end
0 голосов
/ 17 мая 2018

Чтобы проверить уникальность, сначала вы должны создать пользователя с тем же адресом электронной почты, который используется в subject.Тогда ваш subject будет недействительным из-за проверки уникальности по электронной почте.

Что-то вроде:

before { described_class.create!(name: 'foo', email: 'john@home.xyz') }
it 'is invalid if the email is not unique' do
  expect(subject).to be_invalid
end
...