Size: a a a

2021 March 10

P

Pavel in pro.elixir
Тоже по аналогии с @Virviil оборачиваю так “значимые” ошибочки, плюс да, nil пустые строки, when можно так обернуть
источник

LL

Lama Lover in pro.elixir
Źmićer Rubinštejn
Я делаю вот так:


with {:user, {:ok, user}} <- {:user, User.find(user_id)}


Некоторые ошибки не возможно завернуть, кроме того так можно запихнуть nil, библиотечные функции и тыды
Можно писать приватные функции, которые оборачивают ошибки
источник

LL

Lama Lover in pro.elixir
Лично у меня вообще в else очень редко что-то появляется
Обычно ты либо идёшь по happy-path до конца, либо возвращаешь ошибку, которая случилась по пути
Реагировать на ошибки нужно довольно редко

Всякие вещи типа "записать в лог" можно делать и полиморфными
источник

LL

Lama Lover in pro.elixir
А так, я полностью согласен со идеей о том, что в {:error, reason()} у каждой функции должен быть свой reason
Оборачивать в структуру %UserError{kind: :not_found} немного душно, а вот {:error, :user_not_found} сделать не сложно
источник

LL

Lama Lover in pro.elixir
А так, это всё пустые разговоры
На моём опыте, все {:step_name, bar} <- {:step_name, foo()} выглядят криво и тяжело понимаются
Но ничего конкретного, на что можно было бы опереться и точно сказать как лучше, я не могу привести в пример
источник

RB

Roman Berdichevskii in pro.elixir
У вас есть какое-то мнение на счёт того, когда использовать GenServer.cast, а когда send?  У меня коллега спросил и мне сложно ответить на 100% точно почему один, а не другой.

Из того, что мне приходит в голову - в тестах assert_receive принимает только обычные сообщения - приходится использовать cast send, чтобы протестировать. И Process.send_after отправляет обычное сообщение, приходится использовать handle_info для этого.

Есть еще идеи?
источник

ML

Maksim Lapshin in pro.elixir
Roman Berdichevskii
У вас есть какое-то мнение на счёт того, когда использовать GenServer.cast, а когда send?  У меня коллега спросил и мне сложно ответить на 100% точно почему один, а не другой.

Из того, что мне приходит в голову - в тестах assert_receive принимает только обычные сообщения - приходится использовать cast send, чтобы протестировать. И Process.send_after отправляет обычное сообщение, приходится использовать handle_info для этого.

Есть еще идеи?
gen_server:case(well_known_name, MyMessage)

case whereis(well_known_name) of
 undefined -> ok;
 Pid -> Pid ! MyMessage
end
источник

ML

Maksim Lapshin in pro.elixir
cast - это минус нудная проверка
источник

RB

Roman Berdichevskii in pro.elixir
Ага, понятно
источник

ŹR

Źmićer Rubinštejn in pro.elixir
Всегда использовать cast из апи. Мнение очень простое
источник

RB

Roman Berdichevskii in pro.elixir
А если в тесте надо поймать сообщение, которое предназначалось GenServer, как ты будешь ассертить?

Может я в глаза ебусь, но мне казалось мой тест ложился, когда я делал каст, а не сенд
источник

ŹR

Źmićer Rubinštejn in pro.elixir
Зачем мне ассертить это сообщение в тесте?
источник

IK

Ihor Katkov in pro.elixir
Roman Berdichevskii
А если в тесте надо поймать сообщение, которое предназначалось GenServer, как ты будешь ассертить?

Может я в глаза ебусь, но мне казалось мой тест ложился, когда я делал каст, а не сенд
а зачем тебе это нужно тестить? Ты либо тестишь отправку сообщения, либо обработку месседжа. Тестить "поимку" это как тестить ОТП
источник

LL

Lama Lover in pro.elixir
Roman Berdichevskii
А если в тесте надо поймать сообщение, которое предназначалось GenServer, как ты будешь ассертить?

Может я в глаза ебусь, но мне казалось мой тест ложился, когда я делал каст, а не сенд
{:"$gen_cast", message} или как-то так
источник

LL

Lama Lover in pro.elixir
iex(1)> GenServer.cast self(), :x
iex(2)> flush
{:"$gen_cast", :x}
источник

RB

Roman Berdichevskii in pro.elixir
а наверно паттерн тогда не поменял 😄
источник

AD

Anastasiya Dyachenko in pro.elixir
Roman Berdichevskii
А если в тесте надо поймать сообщение, которое предназначалось GenServer, как ты будешь ассертить?

Может я в глаза ебусь, но мне казалось мой тест ложился, когда я делал каст, а не сенд
cast оборачивается функцией этого GenServer, а в тестах этот модуль мокаешь
источник

RB

Roman Berdichevskii in pro.elixir
Ihor Katkov
а зачем тебе это нужно тестить? Ты либо тестишь отправку сообщения, либо обработку месседжа. Тестить "поимку" это как тестить ОТП
я тестирую не поимку, а факт отправки,
источник

AD

Anastasiya Dyachenko in pro.elixir

defmodule Worker do
 def do_smth(message), do: GenServer.cast(__MODULE__, ...)
 
 def handle_cast(...), do: ...
end



defmodule AnotherModule do
  @worker Application.get_env(:my_app, :worker)
 
 def another_fun do
    @worker.do_smth
 end
end



defmodule AnotherModuleTest do
 test ... do
   WorkerMock
   |> expected(:do_smth, ...)
 end
end
источник

LL

Lama Lover in pro.elixir
Anastasiya Dyachenko

defmodule Worker do
 def do_smth(message), do: GenServer.cast(__MODULE__, ...)
 
 def handle_cast(...), do: ...
end



defmodule AnotherModule do
  @worker Application.get_env(:my_app, :worker)
 
 def another_fun do
    @worker.do_smth
 end
end



defmodule AnotherModuleTest do
 test ... do
   WorkerMock
   |> expected(:do_smth, ...)
 end
end
Мне больше нравится вариант с протоколами, а не с @module Application.get_env
источник