Ember-cli/Rails Capybara/RSpec测试

3
我正在尝试使用集成测试来建立我的ember-cli/rails应用程序。在折腾了Ember内置的测试库后,我转而使用RSpec(我本来就用于后端),以及Capybara。尽管现在我可以正确填写表单,但我的登录请求总是失败。我认为问题出在Capybara将请求发送到了不同的数据库环境或其他地方!如果我在rails控制台中检查,用户肯定存在,并且在RSpec测试的过程中我也创建了一个用户。
有人成功设置过Ember/Rails/Capybara/RSpec吗?
这是我的spec:
describe "the signin process", :type => :feature, :js => true do
  it "signs me in" do
    visit '/'
    FactoryGirl.create :user, email: "user@example.com", password: 'password'
    within("#tufts-nav") do
      fill_in 'email', :with => 'test@test.com'
      fill_in 'password', :with => 'password'
    end
    click_button 'Sign In'
#   here authentication fails mysteriously
    expect(page).to have_content 'Jobs'
  end
end

你需要以某种方式编写JS测试(大多数使用带有Qunit的phantomjs),因为Ember的构建方式不同 - 直接使用rspec不起作用,因为你只处理服务器端事务。 - Anthony
不是要争论,但是这篇文章让我觉得这是可能的。我抗拒的唯一原因是我尝试过Qunit(因为它内置于Ember中),但没有成功。现在,如果我能理解为什么向服务器发送的请求失败了就好了! - Josh Pfosi
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - nruth
你是否收到了“401未授权”的失败响应?如果是这样,请尝试使用binding.pry,并确保在登录之前用户存在(您提到过您已经检查了控制台)。此外,请检查/log/test.log中的失败情况。这也发生在我身上,原因是我在rails_helper.rb中错误配置了DatabaseCleaner。 - Ryan
1个回答

2

简单/笨拙的解决方案

在功能测试之前,让 RSpec 将 Ember 构建到 Rails 的 public/ 目录中。

# build ember, hijack rails public/ directory to host ember app
# this way no need to change settings or run any servers
# assumes rails API root path is not used (since ember now hosted from it)
RSpec.configure do |config|
  public_path = Rails.root.join('public')
  config.before(:context, type: :feature) do
    Dir.chdir 'frontend' do
      builder = spawn("ember build --environment=ci -output-path=#{public_path}")
      _pid, status = Process.wait2(builder)
      fail "non-zero exit status #{status}" unless status == 0
    end
  end

  config.after(:context, type: :feature) do
    `git clean -fd #{public_path}`
    `git checkout #{public_path}`
  end
end

配置

我们的ember-cli应用程序位于rails-root/frontend,您可能需要更改名称或路径以指向您的应用程序。

您可能希望尝试环境部分,例如使用production。我这样做是因为我的生产环境已经硬编码以针对我们在heroku上托管的API,但我希望测试是自包含的,即针对capybara托管的rails应用运行。

清理需要Git。如果您没有Git,可以构建到另一个路径并使用mv交换出rails public/目录,然后再放回去。

您可能不希望全局安装用于构建项目的ember-cli(出于版本控制的原因)。如果要使用项目本地的ember-cli,请将spawn命令指向node_modules/ember-cli/bin/ember而不仅仅是ember。

否则,ember-cli-rails

如果您将ember应用程序视为rails应用程序的组件,并希望在rails级别编写测试(rspec、capybara等),那么ember-cli-rails可能是一个不错的选择。

这个宝石处理构建Ember应用程序并从您在Rails路由中挂载的URL提供服务。对于Capybara来说,这是透明的:它向Ruby Web服务器发送请求,并返回调用CSS和JS的HTML,就像Rails通常所做的那样。请注意,目前存在一些使用Ember-cli获取由Rails提供正确路径的资产的问题,这使我转而快速部署其他东西。如果您正在使用Rails资产管道进行CSS、图像等方面的处理,则不应该有问题。对我来说,这影响了Ember-cli应用程序中的图像和Web字体。
除此之外,需要一个用于 API 的服务器和一个用于 Ember 前端的服务器(代理到 Rails API),并且还需要告诉 Capybara 连接到 Ember 前端。 这个 Rakefile这篇文章 看起来是一个好的开始。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接