Как создать 2 экземпляра с использованием factorymethod - PullRequest
0 голосов
/ 14 ноября 2018

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

1) пользователь со значением счетчика 0

2) пользователь со значением счетчика 5 или более

Вот мой заводской код пользователя

FactoryBot.define do
  factory :user do
    sequence(:email) { |n| "user#{n}@abc.com" }
    name 'rishabh agarwal'
    password '12345678'
    counter 0
  end
end

В файле user_controller_spec я написал

context 'get#redeem' do
  it 'should not redeem the account for points lesser than 5' do
    get :redeem, format: :json,params:{:id=>dummyUser.id}
    expect(JSON.parse(response.body)["message"]).to eq("You cannot redeem your points")
   end

  it 'should redeem the account if points are greater than or equal to 5' do                                       
    get :redeem, format: :json,params:{:id=>dummyUser.id}
    json=JSON.parse(response.body)
    expect(JSON.parse(response.body)["counter"]).to eq(5)
  end
end

Пока я использовал let! для создания экземпляра let!(:dummyUser){create :user}

Ответы [ 3 ]

0 голосов
/ 14 ноября 2018

Найден лучший способ .... Просто инициализируйте переменную счетчика с 0 в фабрике и при использовании контекста для более чем 5 измените значение счетчика dummyUser.counter = 5 dummyUser.save, это изменит значение на 5 и котороеможет использоваться в тестовом примере.

0 голосов
/ 14 ноября 2018

Вы можете просто передать атрибуты в методе создания

create(:user, counter: 5)
0 голосов
/ 14 ноября 2018

Вот как я бы структурировал ваши тесты:

context "get#redeem" do
  before { get :redeem, format: :json, params: { id: user.id } }

  context 'when the user has more than or 5 points' do
    let(:user) { create(:user, counter: 5) }

    it 'redeems the account' do
      json = JSON.parse(response.body)
      expect(json["counter"]).to eq 5
      expect(response.status).to eq 200
    end
  end

  context 'when the user has less than 5 points' do
    let(:user) { create(:user, counter: 4) }

    it 'does not redeem the account' do
      json = JSON.parse(response.body)
      expect(json["message"]).to eq "You cannot redeem your points"
      expect(response.status).to eq 403
    end
  end
end

Несколько заметок:

  • Не уверен насчет кода ответа 403. Возможно, вы захотите использовать другой код.
  • Рассмотрите возможность извлечения метода под названием json_response для ваших тестов, который будет выглядеть примерно так:
def json_response
  @json_response ||= JSON.parse(response.body)
end
...