gpt4 book ai didi

ruby-on-rails - 从带有夹具工厂的 Rails 环境运行 JS 测试套件,或用于前端的 API 以请求在后端加载某些夹具

转载 作者:行者123 更新时间:2023-12-03 18:34:15 27 4
gpt4 key购买 nike

我是一名使用 EmberJS 的前端开发人员。这是一个很棒的前端框架,它吸收了 Rails 的许多优点:它非常复杂和自以为是,同时它非常敏捷且易于使用。

Ember 有自己的测试套件,完全可以进行验收测试。但它要么针对后端模拟进行测试,这很糟糕,原因有二:创建功能性后端模拟非常乏味,并且它不测试前端-后端集成。或者 Ember 可以针对正常运行的后端进行测试,这使得无法使用像 FactoryGirl/Fabrication 这样的夹具工厂,并且您必须在每次测试后手动重置测试数据库。

对此的传统解决方案是使用 Capybara。 Capybara 的问题在于 Ember 本质上是非常异步的。 Capybara 无法跟踪 Ember 是否已完成请求数据/计算响应属性/渲染 GUI 等。

有些人使用 Capybara 来测试 Ember,他们都使用最丑陋的技巧。这里有几个让你尝尝它的味道:

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

source

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

source

所以我的想法是使用出色的 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 的原生夹具工厂?

最佳答案

有很多问题:

  1. FactoryGirl 是用于创建工厂的 Ruby DSL - 每个工厂定义只是一个 Ruby 代码块,而不是一些静态定义。如果您想移植工厂的动态方面,例如序列等,您必须编写一个解析器,将 DSL 转换为 javascript DSL。
  2. Javascript 工厂无论如何都无法在不访问您的公共(public) API 的情况下写入数据库。

关于如何桥接的一些粗略想法:

  1. 在您的规范之前设置固定装置 - 并将它们传递给您的脚本。大多数 javascript 驱动程序允许您使用 page.execute_script ,它可用于传递序列化的固定装置。缺点:必须在测试执行开始之前完成。

  2. 设置工厂 API,允许您通过 ajax 调用工厂。最好在可安装的 Rails Engine 中。缺点:慢,异步


def FactoriesController
# get /spec/factories/:factory/new
def new
@factory = FactoryGirl.new(params[:factory_uid])
respond_to do |f|
render json: @factory
end
end

# post /spec/factories/:factory
def create
FactoryGirl.create(params[:factory_uid], factory_params)
end

# ...
end
  1. 创建一个仍然不能解决问题 2 的 FactoryGirl 解析器。

添加:

一个蹩脚的示例工厂客户端:

var FactoryBoy = {
build: function(factory, cb){
$.ajax('/factories/' + factory + '/new' , dataType: 'json').done(function(data){ cb(data) });
},
create: function(factory, cb){
$.ajax('/factories/' + factory , dataType: 'json' method:'POST').done(function(data){ cb(data) });
}
}

测试示例:

module('Unit: SomeThing');

test('Nuking a user', function() {
var done = assert.async();
FactoryBoy.create('user', function(user){
this.store.find('user', user.id).then(function(u){
$('#nuke_user').click();
ok(u.get('isDeleted'));
done();
});
});
});

关于ruby-on-rails - 从带有夹具工厂的 Rails 环境运行 JS 测试套件,或用于前端的 API 以请求在后端加载某些夹具,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30308416/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com