【问题标题】:How to create 2 instances using factorymethod如何使用工厂方法创建 2 个实例
【发布时间】:2018-11-14 05:29:46
【问题描述】:

我正在尝试使用 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}

【问题讨论】:

    标签: ruby-on-rails factories


    【解决方案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
    

    【讨论】:

    • 我有一个问题...
    • 这与评估 beforelet 的时间有关。在这种情况下,before 块在运行 it 定义的单个测试之前运行,并且 let 定义的变量已经可以访问。
    • 就个人而言,我不喜欢从测试机构中删除主要动作。但这仍然是个好建议。
    【解决方案2】:

    找到了一个更好的方法....只需在工厂中将计数器变量初始化为 0 并在使用上下文超过 5 时更改计数器的值 dummyUser.counter=5 dummyUser.save 这会将值更改为 5,并且可以由测试用例使用。

    【讨论】:

      【解决方案3】:

      你可以简单地在 create 方法中传递属性

      create(:user, counter: 5)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-10
        • 2014-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多