2017-02-20 27 views
0

Я нашел похожие ответы на это here и here, но он, похоже, не работает.Назначить текущего пользователя в сеансе для тестов

У меня возникли проблемы с назначением current_user сеансу при тестировании. Мои тесты настроены как этот

setup do 
    %User{ 
    id: 123456, 
    name: "MyName", 
    email: "[email protected]", 
    password_hash: Comeonin.Bcrypt.hashpwsalt("password") 
    } |> Repo.insert 

{:ok, user: Repo.get(User, 123456) } 
end 

и мой тест

test "renders index.html on /coping-strategy", %{user: user} do 
    conn = conn 
     |> assign(:current_user, user) 
     |> get(coping_strategy_path(conn, :index)) 
    assert html_response(conn, 200) =~ "Coping strategies" 
end 

Когда я осмотреть соед здесь, current_user правильно назначен user. Однако, когда я проверяю conn в моем контроллере во время тестирования, current_user всегда nil. Я также попытался использовать build_conn, но он по-прежнему равен нулю.

Вот контроллер:

def index(conn, _params) do 
    user_id = conn.assigns.current_user.id 
    coping_strategies = Post 
         |> Post.get_coping_strategies(user_id) 
         |> Repo.all 
    render conn, "index.html", coping_strategies: coping_strategies 
end 

Если я пытаюсь присвоить что-то другое, чем CURRENT_USER, то это показывает, когда я проверить соед в контроллере. Так что если я добавлю в |> assign(:stuff, "test") в тест, то у меня есть stuff: "test" в назначает в conn. Если я изменю current_user на current_user2 в тесте и в контроллере, он работает, потому что current_user2 обновляется и передается вместе, как я ожидаю.

Есть ли причина, по которой я не могу назначить текущего пользователя таким образом и почему он всегда равен нулю? Есть ли какие-либо шаги, которые мне не хватает, чтобы сделать это для current_user в частности?

Редактировать

Вот где current_user создается в Идент заглушкой

def call(conn, repo) do 
    user_id = get_session(conn, :user_id) 
    user = user_id && repo.get(Healthlocker.User, user_id) 
    assign(conn, :current_user, user) 
end 
+0

Можете ли вы опубликовать код, который назначает 'current_user' в вашем приложении (плагин для проверки подлинности?)? Вероятно, вы устанавливаете его на «nil», даже если он уже установлен. – Dogbert

+0

@Dogbert, который выглядит так. пользователь «nil», когда я запускаю тесты. – Katherine

ответ

2

Поскольку вы непосредственно установка :current_user в assigns в тестах, вы должны пропустить выборку пользователя от сессия :user_id, если assigns содержит :current_user в штепсельной вилке:

def call(conn, repo) do 
    if conn.assigns[:current_user] do 
    conn 
    else 
    user_id = get_session(conn, :user_id) 
    user = user_id && repo.get(Healthlocker.User, user_id) 
    assign(conn, :current_user, user) 
    end 
end