2014-02-19 8 views
0

Я использую decent_exposure представить некоторые instance_variables:Как проверить наличие переменных экземпляра в контроллере?

expose(:my_custom_variable) { current_user.my_variable } 

Так что теперь эта переменная доступна в моем контроллере как my_custom_variable.

Но я хотел бы убедиться, что он там с моим тестом.

assert_not_nil my_custom_variable 

Какой из них не работает. Если я поставлю отладчик в свой тест, у меня нет доступа к этой переменной. Я пробовал все из следующего.

@controller.instance_variable_get("@my_custom_variable") 
@controller.instance_variable_get("my_custom_variable") 
@controller.instance_variable_get(:my_custom_variable) 
@controller.assigns(:@my_custom_variable) 
assigns(:my_custom_variable) 
@controller.get_instance(:my_custom_variable) 
@controller.get_instance("my_custom_variable") 
@controller.get_instance("@my_custom_variable") 

Ничего из этого не может быть. Любые идеи?

Примечание: Я не использую rspec. Это встроено в функциональные тесты rails.

+0

Возможно, проблема 'decent_exposure' только присваивает локальной переменной, когда представление оказывается? Несмотря на то, что просмотрел документы, похоже, это не так. –

+1

Использует вспомогательные методы, а не экземпляры или локальные переменные. https://github.com/voxdolo/decent_exposure/blob/master/lib/decent_exposure/expose.rb#L51-L62 –

ответ

2

На странице достойного_экстракции внизу есть несколько примеров.

Тестирование

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

describe CompaniesController do 
    describe "GET index" do 

    # this... 
    it "assigns @companies" do 
     company = Company.create 
     get :index 
     assigns(:companies).should eq([company]) 
    end 

    # becomes this 
    it "exposes companies" do 
     company = Company.create 
     get :index 
     controller.companies.should eq([company]) 
    end 
    end 
end 

Просмотреть данные по одной схеме:

describe "people/index.html.erb" do 

    # this... 
    it "lists people" do 
    assign(:people, [ mock_model(Person, name: 'John Doe') ]) 
    render 
    rendered.should have_content('John Doe') 
    end 

    # becomes this 
    it "lists people" do 
    view.stub(people: [ mock_model(Person, name: 'John Doe') ]) 
    render 
    rendered.should have_content('John Doe') 
    end 

end 
+0

Извините, я должен был упомянуть, что я не использую rspec .. – Trip

+0

с MiniTest или TestUnit, это должно быть что-то вроде 'assert_equal [company], controller.companies' я полагаю – krabbi

+1

Вы управляете им? Возможно, вы можете включить простой, но полный тестовый пример, который работает. Итак, у всех есть решение TestUnit/Minitest для этой проблемы =). – krabbi

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