rspec 可以用于对集成的 rails-angular 应用程序进行功能测试吗?
Can rspec be used to feature test an integrated rails-angular app?
我有一个非常基本的集成 rails-angular 应用程序。它只是呈现一个 link,它使用来自对 rails:
的 get 请求的数据
'use strict';
angular.module('angularRspec.controllers')
.controller('FightersController',
function($scope, $http){
console.log("FightersController is loaded...");
$scope.fighters = [];
$http.get('./fighters.json').
success(function(data, status){
$scope.fighters = data;
console.log(status);
console.log(data);
}).
error(function(data, status, headers, config) {
console.log(status);
console.log(headers);
});
});
当我 运行 这样的规格,并使用 pry 时,我的 link 没有出现:
require 'rails_helper'
feature 'Index of Fighters' do
let!(:fighter) { create(:fighter) }
scenario 'User visits home', js: true do
visit '/'
binding.pry
expect(true).to eq true
end
end
但是,我从控制台确认 angular 正在测试浏览器中加载,响应是 200。问题似乎不是特定于浏览器的。我在这里发布了一个回购协议:angular_rspec.
这是我的 spec_helper.rb:
ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'rspec/autorun'
require 'capybara'
Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }
RSpec.configure do |config|
config.expect_with :rspec do |expectations|
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
end
config.mock_with :rspec do |mocks|
mocks.verify_partial_doubles = true
end
Capybara.javascript_driver = :selenium
end
这是我的 rails_helper.rb:
ENV['RAILS_ENV'] ||= 'test'
require 'spec_helper'
require File.expand_path('../../config/environment', __FILE__)
Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }
ActiveRecord::Migration.check_pending!
RSpec.configure do |config|
config.fixture_path = "#{::Rails.root}/spec/fixtures"
config.use_transactional_fixtures = true
config.infer_spec_type_from_file_location!
end
这是我的布局:
<!DOCTYPE html>
<html lang="en" ng-app="angularRspec">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title><%= content_for?(:title) ? yield(:title) : "angular rspec" %></title>
<%= csrf_meta_tags %>
<%= stylesheet_link_tag "application", :media => "all" %>
</head>
<body>
<div class="container">
<h1>Angular Rspec</h1>
<div ng-view></div>
<div ng-controller="FightersController" id="primary"></div>
</div>
<%= javascript_include_tag "application" %>
</body>
</html>
您需要为水豚启用 javascript 驱动程序:
Capybara.current_driver = Capybara.javascript_driver
我的猜测是您的 create(:fighter)
调用 运行 在与 AJAX get 请求不同的线程(和数据库事务)中。尝试将此代码段添加到您的 rails_helper
.
class ActiveRecord::Base
mattr_accessor :shared_connection
@@shared_connection = nil
def self.connection
@@shared_connection || retrieve_connection
end
end
ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection
来源:https://github.com/jnicklas/capybara#transactions-and-database-setup
我有一个非常基本的集成 rails-angular 应用程序。它只是呈现一个 link,它使用来自对 rails:
的 get 请求的数据'use strict';
angular.module('angularRspec.controllers')
.controller('FightersController',
function($scope, $http){
console.log("FightersController is loaded...");
$scope.fighters = [];
$http.get('./fighters.json').
success(function(data, status){
$scope.fighters = data;
console.log(status);
console.log(data);
}).
error(function(data, status, headers, config) {
console.log(status);
console.log(headers);
});
});
当我 运行 这样的规格,并使用 pry 时,我的 link 没有出现:
require 'rails_helper'
feature 'Index of Fighters' do
let!(:fighter) { create(:fighter) }
scenario 'User visits home', js: true do
visit '/'
binding.pry
expect(true).to eq true
end
end
但是,我从控制台确认 angular 正在测试浏览器中加载,响应是 200。问题似乎不是特定于浏览器的。我在这里发布了一个回购协议:angular_rspec.
这是我的 spec_helper.rb:
ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'rspec/autorun'
require 'capybara'
Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }
RSpec.configure do |config|
config.expect_with :rspec do |expectations|
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
end
config.mock_with :rspec do |mocks|
mocks.verify_partial_doubles = true
end
Capybara.javascript_driver = :selenium
end
这是我的 rails_helper.rb:
ENV['RAILS_ENV'] ||= 'test'
require 'spec_helper'
require File.expand_path('../../config/environment', __FILE__)
Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }
ActiveRecord::Migration.check_pending!
RSpec.configure do |config|
config.fixture_path = "#{::Rails.root}/spec/fixtures"
config.use_transactional_fixtures = true
config.infer_spec_type_from_file_location!
end
这是我的布局:
<!DOCTYPE html>
<html lang="en" ng-app="angularRspec">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title><%= content_for?(:title) ? yield(:title) : "angular rspec" %></title>
<%= csrf_meta_tags %>
<%= stylesheet_link_tag "application", :media => "all" %>
</head>
<body>
<div class="container">
<h1>Angular Rspec</h1>
<div ng-view></div>
<div ng-controller="FightersController" id="primary"></div>
</div>
<%= javascript_include_tag "application" %>
</body>
</html>
您需要为水豚启用 javascript 驱动程序:
Capybara.current_driver = Capybara.javascript_driver
我的猜测是您的 create(:fighter)
调用 运行 在与 AJAX get 请求不同的线程(和数据库事务)中。尝试将此代码段添加到您的 rails_helper
.
class ActiveRecord::Base
mattr_accessor :shared_connection
@@shared_connection = nil
def self.connection
@@shared_connection || retrieve_connection
end
end
ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection
来源:https://github.com/jnicklas/capybara#transactions-and-database-setup