2013-12-24 4 views
-1

У меня есть некоторые тестовые модели: ПользовательСтранное поведение завода девушки

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 во всех случаях.

EDITED: Хорошо, мой метод показать пользователю:

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 actualy {"status"=>"error", "descr"=>"INVALID_USER_ID"}

+0

Как проходят тесты? Какую ошибку или исключение вы получаете? – janfoeh

+0

какие ошибки вы получаете? –

+0

мой метод отображения пользователя падает, где много логики, где – cnaize

ответ

1

Я вижу, что вы просили 21 вопрос в течение девяти месяцев, поэтому я извиняюсь, если следующее кажется рудиментарным, но, учитывая ваш вопрос и ваш комментарий, я чувствую, что это единственный ответ, который я могу дать.

Канонический вопрос StackOverflow предоставляет некоторый код, ожидание или желание для конкретного результата и некоторый вывод, который отличается от этого результата. Вопрос неявно или явно задается вопросом, почему вывод отличается от желания или ожидания.

В вашем случае вы предоставили некоторый код, ожидание (отсутствие ошибки) и некоторые явные вопросы по этому поводу.

Вы, однако, не предоставили выходные данные, несмотря на то, что вас попросили два пользователя, которые пытаются вам помочь. Первый спросил: «Какую ошибку или исключение вы получаете»? Второй спросил: «Какие ошибки вы получаете»? Вы отвечаете на оба: «мой метод show user терпит неудачу, где много логики где». Это не показало никаких особенностей и не выводило.

В Ruby, при возникновении ошибки, вы обычно получаете сообщение об ошибке и трассировку стека, причем последний предоставляет «след панировочных сундуков», сообщающий вам, какое программное обеспечение вы выполняли с помощью любой серии вызовов методов, которые вы делали. И исходный файл, и номер строки в этом исходном файле приведены для каждого метода. В общем случае, если вы хотите узнать, где происходит ошибка, вы смотрите на код вокруг каждой позиции в стеке. Если вы пытаетесь получить помощь по вашей проблеме, вам часто необходимо разделить код, связанный с каждой позицией (например, код формы метода, в котором вы были в этой позиции). Вы этого не сделали.

Что касается вашего конкретного случая, вы сказали, что ваш код не выполняется при добавлении задания в вашу установку, форм:

@customer_e = FactoryGirl.create :customer_e 

вы потом сказать, что:

Затем некоторые мои тесты выпадают. Почему это может быть? Я НЕ ИСПОЛЬЗУЮ @customer_e в все случаи.

добавляя комментарий, что:

мое шоу метод пользователь падает, где много логики, где

В отсутствие вывода или кода, это не представляется возможным обеспечить конкретную причину, почему ваш код «не работает», но мы можем дать общий ответ.

Ваш код не потому, что существует некоторая условная логика присутствует, которая ведет себя по-другому, если дополнительный код включен был выполнен (например, код в ваш show метод, который зависит от @customer_e определяется)

Тот факт, что @customer_e не используется в все случаи не имеют отношения к делу, потому что только один используется, чтобы вызвать ошибку.

+0

Я боюсь своего NDA, но я отредактировал свой пост – cnaize

Смежные вопросы