Как проводить тесты в эликсире / фениксе с использованием гончей и селена
Вот мой mix.exs
defmodule HelloPhoenix.Mixfile do
use Mix.Project
def project do
[app: :hello_phoenix,
version: "0.0.1",
elixir: "~> 1.0",
elixirc_paths: elixirc_paths(Mix.env),
compilers: [:phoenix, :gettext] ++ Mix.compilers,
build_embedded: Mix.env == :prod,
start_permanent: Mix.env == :prod,
aliases: aliases,
deps: deps]
end
# Configuration for the OTP application.
#
# Type `mix help compile.app` for more information.
def application do
[mod: {HelloPhoenix, []},
applications: app_list(Mix.env) ]
end
def app_list do
[:phoenix, :phoenix_html, :cowboy, :logger, :gettext, :phoenix_ecto, :postgrex]
end
def app_list(:test), do: [:hound | app_list]
def app_list(_), do: app_list
# Specifies which paths to compile per environment.
defp elixirc_paths(:test), do: ["lib", "web", "test/support"]
defp elixirc_paths(_), do: ["lib", "web"]
# Specifies your project dependencies.
#
# Type `mix help deps` for examples and options.
defp deps do
[{:phoenix, "~> 1.1.4"},
{:postgrex, ">= 0.0.0"},
{:phoenix_ecto, "~> 2.0"},
{:phoenix_html, "~> 2.4"},
{:phoenix_live_reload, "~> 1.0", only: :dev},
{:gettext, "~> 0.9"},
{:cowboy, "~> 1.0"},
{:hound, "~> 0.8"}]
end
# Aliases are shortcut or tasks specific to the current project.
# For example, to create, migrate and run the seeds file at once:
#
# $ mix ecto.setup
#
# See the documentation for `Mix` for more info on aliases.
defp aliases do
["ecto.setup": ["ecto.create", "ecto.migrate", "run priv/repo/seeds.exs"],
"ecto.reset": ["ecto.drop", "ecto.setup"]]
end
end
Вот мой config/config.exs
# Define your application's host and port (defaults to "http://localhost:4001")
#config :hound, app_host: "http://localhost", app_port: 4000
# Start with selenium driver (default)
config :hound, driver: "selenium"
# Use Chrome with the default driver (selenium)
#config :hound, browser: "chrome"
# Start with default driver at port 1234 and use firefox
#config :hound, port: 1234, browser: "firefox"
# Start Hound for PhantomJs
#config :hound, driver: "phantomjs"
# Start Hound for ChromeDriver (default port 9515 assumed)
#config :hound, driver: "chrome_driver"
тест /sample_test.exs
defmodule HelloPhoenix.SampleTest do
use HelloPhoenix.ConnCase
# Import Hound helpers
use Hound.Helpers
# Start a Hound session
hound_session
IO.puts "hai"
test "GET /" do
navigate_to("http://localhost:4000")
:timer.sleep(5000) # puts server to sleep
assert page_source =~ "Welcome to Phoenix"
end
end
Config/test.exs
# We don't run a server during test. If one is required,
# you can enable the server option below.
config :hello_phoenix, HelloPhoenix.Endpoint,
http: [port: 4000],
server: true
Запуск сервера вебдрайвера (пробовал все по одному за раз)
java -jar selenium-server-standalone-2.48.2.jar
java -jar selenium-server-standalone-2.49.0.jar
java -jar selenium-server-standalone-2.52.0.jar
Docker run -it -p 4444:4444 даниельфрг / селен
запуск докера --privileged -p 4444:4444 -p 5999:5999 -d vvoyer/docker-selenium-firefox-chrome
Я получаю эту ошибку каждый раз, когда я запускаю приложение:
karthik@dkarnik2-Vostro-3558:~/5/hello_phoenix/hello_phoenix$ mix test
hai
....10:46:52.543 [error] GenServer Hound.SessionServer terminating
** (MatchError) no match of right hand side value: {:error, %HTTPoison.Error{id: nil, reason: :econnrefused}}
(hound) lib/hound/request_utils.ex:43:Hound.RequestUtils.send_req/4
(hound) lib/hound/session_server.ex:67: Hound.SessionServer.handle_call/3
(stdlib) gen_server.erl:629: :gen_server.try_handle_call/4
(stdlib) gen_server.erl:661: :gen_server.handle_msg/5
(stdlib) proc_lib.erl:240: :proc_lib.init_p_do_apply/3
1) test GET / (HelloPhoenix.SampleTest)
test/sample_test.exs:10
** (exit) exited in: GenServer.call(Hound.SessionServer, {:change_session, #PID<0.394.0>, :default, %{}}, 60000)
** (EXIT) an exception was raised:
** (MatchError) no match of right hand side value: {:error, %HTTPoison.Error{id: nil, reason: :econnrefused}}
(hound) lib/hound/request_utils.ex:43: Hound.RequestUtils.send_req/4
(hound) lib/hound/session_server.ex:67: Hound.SessionServer.handle_call/3
(stdlib) gen_server.erl:629: :gen_server.try_handle_call/4
(stdlib) gen_server.erl:661: :gen_server.handle_msg/5
(stdlib) proc_lib.erl:240: :proc_lib.init_p_do_apply/3
stacktrace:
(elixir) lib/gen_server.ex:544: GenServer.call/3
test/sample_test.exs:8: HelloPhoenix.SampleTest.__ex_unit_setup_1/1
test/sample_test.exs:1: HelloPhoenix.SampleTest.__ex_unit__/2
Finished in 0.7 seconds (0.5s on load, 0.1s on tests)
5 tests, 1 failure
Randomized with seed 332515
karthik@dkarnik2-Vostro-3558:~/5/hello_phoenix/hello_phoenix$
1 ответ
Ради полноты на случай, если кто-то столкнется с подобной проблемой, я сделаю резюме:
Когда Эрланг возвращает :econnrefused
ошибка означает, что есть проблема с соединением. Следующее относится к любому языку программирования, потому что это проблема сети:
- Ваш сетевой интерфейс не работает. Решение: подключиться к интерфейсу.
- Вы пытаетесь подключиться к неправильному адресу и / или порту. Решение. Просмотрите свой код или конфигурацию, чтобы проверить правильность IP-адресов и портов. Также проверьте, действительно ли удаленный хост находится в этом IP-адресе, и прослушивает соединения в этом порту.
- Вы заблокированы брандмауэром. Решение. Это более сложная проблема, поскольку она зависит от того, как вы развертываете и тестируете свое приложение.
- Удаленный хост недоступен с хоста, на котором запущено ваше приложение. Решение: Также это более сложная проблема, но для начала вы можете проверить, находится ли ваш удаленный хост в частной сети:
- Настройте соответствующую переадресацию портов в точке доступа.
- Если это виртуальная машина, подключите виртуальный сетевой интерфейс гостевой ОС к мостовому адаптеру вместо адаптера NAT и используйте тот же сетевой интерфейс, что и у вашей хост-ОС. Если у вас не включен DHCP в вашем маршрутизаторе / точке доступа, вам следует назначить гостевой машине новый IP-адрес в той же сети, что и хост-компьютер. В Virtualbox вы можете настроить адаптер в
Settings > Network
.*