2017-02-20 60 views
0

我已经找到类似的答案,此herehere,但它似乎并没有工作。指定当前用户进行测试

我在测试时将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")中添加了测试,那么我在0123中指定stuff: "test"。如果我在测试和控制器中将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'的代码吗(认证插件?)?即使已设置,您可能会将其设置为“无”。 – Dogbert

+0

@Dogbert看起来像它。当我运行测试时,用户是'nil'。 – Katherine

回答

2

既然你在测试中assigns直接设置:current_user,你需要跳过取出由用户会话的:user_id如果assigns包含:current_user在auth插件中:

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