工厂女孩的奇怪行为

时间:2013-12-24 12:57:36

标签: ruby-on-rails ruby factory-bot

我有一些测试模型: 用户

FactoryGirl.define do
  factory :user do
    first_name {generate :name}
    last_name {generate :name}
    address {generate :string}
    country {generate :string}
    zip {generate :string}
    city {generate :string}
    phone {generate :string}
    company_name {generate :string}
    signature {generate :string}
    v_token {generate :string}
    password_digest {generate :password_digest}
    email {generate :email}
    lang 'en'
    theme 'air'
  end
end

承包商

FactoryGirl.define do
  factory :contractor, :parent => :user, class: 'Contractor' do
    type 'Contractor'
    u_token 'contractor'
  end
end

客户

FactoryGirl.define do
  factory :customer, :parent => :user, class: 'Customer' do
    type 'Customer'
    u_token 'customer'
    contractor
  end
end

和CustomerE

FactoryGirl.define do
  factory :customer_e, :parent => :user, class: 'CustomerE' do
    type 'CustomerE'
    u_token 'customer_e'
    contractor
    customer
  end
end

在我的测试中,我有:

setup do
    @customer = FactoryGirl.create :customer
    @contractor = @customer.contractor
end

我的测试一切正常。 但是,如果我添加

setup do
    @customer_e = FactoryGirl.create :customer_e
    @customer = FactoryGirl.create :customer
    @contractor = @customer.contractor
end

然后我的一些测试失败了。为什么会这样? 我不会在所有情况下都使用@customer_e

编辑: 好的,我的show user方法:

  def show
    user = User.find_by_u_token(params[:u])
    if !user
      render json: {status: 'error', descr: 'INVALID_U_TOKEN'}
      return
    end

    user = find_user_for_user(user, params[:id])
    if !user
      render json: {status: 'error', descr: 'INVALID_USER_ID'}
      return
    end

    render json: {status: 'ok', user: {email: user.email,
                                       first_name: user.first_name,
                                       last_name: user.last_name,
                                       address: user.address,
                                       country: user.country,
                                       zip: user.zip,
                                       city: user.city,
                                       phone: user.phone,
                                       company_name: user.company_name,
                                       signature: user.signature,
                                       lang:user.lang}}
  end

我的find_user_for_user方法:

  def find_user_for_user(user, user_id)
    users = users_for_user(user)
    users.detect {|u| u.id == user_id.to_i}
  end

  def users_for_user(user)
    users = []
    case user.type
      when 'Contractor'
        users << user
        user.contractorEs.each do |cne| users << cne end
        user.customers.each do |cs| users << cs end
        user.customerEs.each do |cse| users << cse end
      else
        users << user.contractor
        user.contractor.contractorEs.each do |cne| users << cne end
        user.contractor.customers.each do |cs| users << cs end
        user.contractor.customerEs.each do |cse| users << cse end
    end
    users
  end

我的测试:

test "should show user" do
    get :show, :u => @contractor.u_token, :id => @contractor.id
    assert_response :success

    json = response.body
    data = JSON.parse(json)

    assert_equal @contractor.email, data['user']['email']
    assert_equal 2, data.length
  end

问题是data是实际的{"status"=>"error", "descr"=>"INVALID_USER_ID"}

1 个答案:

答案 0 :(得分:1)

我看到你在九个月内问了21个问题,所以如果以下内容看起来很简陋,我会道歉,但鉴于你的问题和评论,我觉得这是我能给出的唯一答案。

规范的StackOverflow问题提供了一些代码,对特定结果的期望或期望以及与该结果不同的一些输出。关于为什么输出与期望或期望不同,要么隐含地或明确地提出一个问题。

在您的情况下,您提供了一些代码,期望(没有错误)以及一些明确的问题。

但是,尽管有两个用户试图帮助您,但您还没有提供您获得的输出。第一个问“你得到什么错误或例外”?第二个问道,“你得到哪些错误”?你回答的都是“我的show user方法失败,其中有很多逻辑在哪里”。这没有提供细节,也没有输出。

在Ruby中,当发生错误时,您通常会收到一些错误消息和堆栈跟踪,后者提供“痕迹痕迹”,告诉您通过您正在进行的任何方法调用执行的软件。每个方法都给出了源文件和源文件中的行号。通常,如果要查找错误发生的位置,请查看堆栈中每个位置周围的代码。如果您正试图获得有关问题的帮助,则通常需要共享与每个职位相关的代码(例如,代码形成您在该职位所处的方法)。你没有做过这些。

至于您的具体情况,您已经说过,当您在设置中添加作业时,您的代码会失败:

@customer_e = FactoryGirl.create :customer_e

然后你继续说:

  

然后我的一些测试失败了。为什么会这样?我不会在@customer_e中使用   所有情况。

添加您的评论:

  

我的show user方法落在哪里,其中有很多逻辑

如果没有输出或代码,则无法提供有关代码“失败”原因的具体原因,但我们可以提供通用答案。

您的代码失败,因为存在一些条件逻辑,如果您执行的其他代码已被执行(例如,show方法中的代码依赖于@customer_e被定义),则其行为会有所不同

所有案例中未使用@customer_e这一事实无关紧要,因为它只会使用一个来导致错误。