【发布时间】:2015-05-18 16:28:32
【问题描述】:
我是一名使用 EmberJS 的前端开发人员。这是一个很棒的前端框架,它采用了 Rails 的许多优点:它非常复杂和固执己见,同时它非常灵活且易于使用。
Ember 拥有自己的测试套件,完全能够进行验收测试。但是它要么针对后端模拟进行测试,这有两个原因很糟糕:创建功能性后端模拟很乏味,并且它不测试前端-后端集成。或者 Ember 可以针对正常运行的后端进行测试,这使得无法使用像 FactoryGirl/Fabrication 这样的夹具工厂,并且您必须在每次测试后手动重置测试数据库。
对此的传统解决方案是使用 Capybara。 Capybara 的问题在于 Ember 本质上是非常异步的。 Capybara 无法跟踪 Ember 是否已完成请求数据/计算反应属性/渲染 GUI 等。
有些人使用 Capybara 来测试 Ember,他们都使用最丑陋的 hack。这里只是给你几个让你尝尝它的恶臭:
patiently do
return unless page.has_css? '.ember-application'
end
2000.times do #this means up to 20 seconds
return if page.evaluate_script "(typeof Ember === 'object') && !Ember.run.hasScheduledTimers() && !Ember.run.currentRunLoop"
sleep 0.01
end
def wait_for_ajax
counter = 0
while true
active = page.execute_script(“return $.active”).to_i
#puts “AJAX $.active result: “ + active.to_s
break if active < 1
counter += 1
sleep(0.1)
raise “AJAX request took longer than 5 seconds OR there was a JS error. Check your console.” if counter >= 50
end
end
所以这个想法是使用美妙的 Ember 的 JS 测试套件来执行 来自 Rails 的测试。它将允许使用 Factory Girl 为每个测试专门设置数据库......并运行 NodeJS/Ember 测试而不是 Capybara。
我可以想象这样的事情:
describe "the signin process", :type => :feature do
before :each do
FactoryGirl.create(:user, :email => 'user@example.com', :password => 'password')
end
it "signs me in" do
test_in_ember(:module => 'Acceptance: User', :filter => 'signs me in')
end
it "logs me out" do
test_in_ember(:module => 'Acceptance: User', :filter => 'logs me out')
end
end
Ember 有一个用于测试的命令行界面,可以运行基于Testem 的特定测试。
或者,Ember 测试套件可以正常使用,但它会通过调用特殊 API 开始每个测试,请求加载某些夹具工厂定义。
正式问题:我如何同时使用两全其美的优点:EmberJS 的原生测试套件和 Ruby on Rails 的原生夹具工厂?
【问题讨论】:
-
您可以将固定装置转储到 JSON 文件中。但它们仍然需要由某种服务器提供服务,以避免
file://协议和 CSR 的问题。 -
@papirtiger,这毫无意义。我最初的目标是测试前端-后端集成,动态测试真正的后端逻辑,而不是一些静态 API 模拟。
-
FactoryGirl 是一个用于创建工厂的 Ruby DSL - 每个工厂定义只是一个 ruby 代码块,而不是一些静态定义。如果你想移植工厂的动态方面,例如序列等,你必须编写一个解析器,它可以转译成 javascript。
标签: ruby-on-rails ember.js capybara integration-testing factory-bot