Заставляем Cucumber & Subdomain-fu играть вместе - PullRequest
1 голос
/ 17 июля 2009

Я недавно начал использовать Cucumber & Subdomain-fu вместе, и это заставило меня делать некоторые ужасные вещи.

У меня есть определение шага, которое выглядело так:

path = grok_path(path)
get path

Это красиво и легко, на мой взгляд. Но теперь это так:

path = grok_path(path)
get "http://#{subdomain}.example.com#{path}"

Это работает , но оно не совсем чистое. Какой лучший способ сделать это?

Ответы [ 2 ]

2 голосов
/ 22 сентября 2011

Я не уверен, насколько хорошо это применимо в Cucumber (здесь используется musta), но, попробовав несколько рекомендаций в других местах, похоже, это работает надежно:

def in_subdomain(str)
  # test.host == default testing domain, feel free to change to match your usage
  @request.host = "#{str}.test.host"
end

А затем, прежде чем позвонить get, вам просто нужно убедиться, что вы in_subdomain('subdomain-fuuuuuu'). Это правильно устанавливает URL и, по крайней мере, current_subdomain (я не проверял все ), перенаправляет без указания субдомена, оставшегося в поддомене, и все перенаправления в другие субдомены (или :subdomain => false) все еще установите правильное значение redirected_to.

Эти (высококачественные, я уверен, вы можете сказать) тесты проходят, например, и они проверяют current_subdomain в контроллере:

should "show on the owner's subdomain" do
  in_subdomain(@user.domain)
  get :show, :id => @user.things.first.id
  assert_response :success
end
should "not show on another users' subdomain" do
  in_subdomain(@random_user.domain)
  get :show, :id => @user.things.first.id
  assert_redirected_to user_url(@random_user, :subdomain => @random_user.domain)
end
should "not show on a non-existent subdomain" do
  in_subdomain("cthulhu-fhtagn")
  get :show, :id => @user.things.first.id
  assert_redirected_to root_url(:subdomain => false)
end
2 голосов
/ 31 июля 2009

Просто, чтобы сделать определения шагов более читабельными, вы можете обернуть эти вещи в небольшой метод, например:

def subdomained_path(path, subdomain):
    return "http://#{subdomain}.example.com#{path}"
end

Который позволяет вам привести в порядок определения шагов примерно так:

path = grok_path(path)
get subdomained_path(path, subdomain)

Функционально оба они эквивалентны (и одинаково хакерские), но предложенные мной изменения, по крайней мере, заставят код выглядеть немного чище. Если у вас есть доступ для изменения Net :: HTTP.get, вы можете изменить сам метод get, чтобы он принимал аргумент субдомена, делая его еще чище.

...