如何使用factorymethod创建2个实例

时间:2018-11-14 05:29:46

标签: ruby-on-rails factories

我正在尝试使用rspec为我的Rails应用程序编写测试,我基本上想创建两个实例

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 :(得分:1)

这就是我构建测试的方式:

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

答案 1 :(得分:0)

找到了一种更好的方法....只需在工厂中将计数器变量初始化为0,然后在使用上下文的情况下再更改5即可更改计数器的值 dummyUser.counter = 5 dummyUser.save 这会将值更改为5,供测试用例使用。

答案 2 :(得分:0)

您只需在create方法中传递属性

create(:user, counter: 5)