在 Ruby 中使用 jasmine
jasmine gem 可在有或没有 Rails 的情况下使用。(注意:jasmine gem 仅支持 Asset Pipeline,不支持 Webpacker。jasmine-browser-runner 可与任意一种风格的 Rails JavaScript 管理配合使用。)
将 jasmine gem 添加到 gemfile 中,并 bundle install
gem 'jasmine'
设置
要安装默认 jasmine.yml 和示例 jasmine_helper.rb,如果项目正在使用 Rails,jasmine 有可用于进行所有设置的生成器。
rails g jasmine:install
如果项目不使用 Rails,所有这些命令也可以在命令行工具 jasmine
中使用。命令行工具还将修改 Rakefile 以加载 Jasmine 任务。
jasmine init
Jasmine 还有部分示例规范(含实现),可供安装。
rails g jasmine:examples
jasmine examples
使用
安装 jasmine.yml
后,您可以在 rake
中使用以下两个命令。
如果您想要启动一个继续运行的服务器,这样您就可以将浏览器指向该服务器
rake jasmine
在 CI 服务器上使用
rake jasmine:ci
您还可以针对单个 jasmine:ci 运行覆盖 jasmine.yml
中的随机化设置以进行调试。
rake jasmine:ci[true]
此外还可以指定种子
rake jasmine:ci[true,4321]
此时您应该能够编写您的第一个套件
配置
主配置在 jasmine.yml
中进行,该文件默认位于 spec/javascripts/support
中。jasmine.yml
配置了在运行测试的页面上应加载哪些文件,以及应加载的文件的 Ruby 位置,以便进行更多复杂配置,如下所示
jasmine_helper.rb
文件由 jasmine.yml
中的 spec_helper
密钥指定,它包含一个配置块。
Jasmine.configure do |config|
# You can add rack handlers for specific urls
config.add_rack_path '/something' do
[200]
end
# And mount other rack applications
config.add_rack_app MyRackApp
# You can configure the port that the `rake jasmine` command starts a server on
config.server_port = 12345
# You can configure the port that the `rake jasmine:ci` command starts it's server on
config.ci_port = 54321
# You can add [custom formatters](#section-Custom_Formatters)
config.formatters << My::Custom::Formatter
# You can use a [custom runner](#section-Custom_Runners)
# The `runner` option on config should be a lambda or Proc that receives a formatter
# and server url and returns a constructed runner object. The lambda allows you to
# configure other options that need to be configured at initialization time.
config.runner = lambda do |formatter, server_url|
My::Custom::Runner.new(formatter, server_url, 100)
end
end
配置默认 phantomjs 运行器
phantomjs 运行器支持一些附加选项。
如果您想查看规范的 console.log
消息输出,将 show_console_log 设置为 true。
show_console_log: true
如果您需要配置 phantomjs 网页对象,您可以指定一个配置脚本。
phantom_config_script: 'relative/path/from/project/root.js'
这个文件会被 Phantom Runner require
,并且 configure
函数会传递已构建的 page
对象。
exports.configure = function(page) {
page.viewportSize = {
width: 340,
height: 220
};
};
自定义格式化程序
默认情况下,jasmine:ci
rake 任务在运行规格时输出 .
、F
和 *
,最后进行总结。如果您想要更改输出或生成一些其他输出,您将需要一个自定义格式化程序。有关如何添加您的自定义格式化程序的示例,请参见 配置部分
您的自定义格式化程序必须实现 2 个方法,format
和 done
class My::Custom::Formatter
# `format` is called by the runner every time it gets a batch of results from the page.
# The parameter will be an array of `Jasmine::Result` objects
def format(results)
results.each do |result|
puts result.status
end
end
# `done` will be called by the runner after all results have come in.
def done
puts 'Done running tests'
end
end
Jasmine 团队还维护一个自定义格式化程序,该格式化程序生成 JUnit 样式 XML,以便在懂得如何解析它的 CI 服务器上使用。 Jasmine JUnit XML 格式化程序
自定义运行器
默认情况下,jasmine:ci
rake 任务使用 PhantomJS 加载 Jasmine 规格运行器页面并运行测试。如果您想要使用不同的浏览器运行测试,或更改 PhantomJS 的使用方法,您将需要一个自定义运行器。有关如何添加您的自定义运行器的示例,请参见 配置部分
构建完成后,运行器只需实现一个 run
方法
class My::Custom::Runner
def initialize(formatter, jasmine_server_url, result_batch_size)
# The formatter passed in is responsible for making sure all configured
# formatters receive the same messages.
@formatter = formatter
# The `jasmine_server_url` is the full http://<host>:<port> url where
# the jasmine server was started
@jasmine_server_url = jasmine_server_url
@result_batch_size = result_batch_size
end
# `run` is responsible coordinating the test run.
def run
# Here we're using Phantom to load the page and run the specs
command = "#{Phantomjs.path} 'phantom_run.js' #{@jasmine_server_url} #{@result_batch_size}"
IO.popen(command) do |output|
# The `phantom_jasmine_run.js` script writes out batches of results as JSON
output.each do |line|
raw_results = JSON.parse(line, :max_nesting => false)
# Formatters expect to get `Jasmine::Result` objects.
# It is the runner's job to convert the result objects from the page,
# and pass them to the `format` method of their formatter.
results = raw_results.map { |r| Result.new(r) }
@formatter.format(results)
end
end
# When the tests have finished, call `done` on the formatter to run any
# necessary completion logic.
@formatter.done
end
# If the runner needs some javascript to be loaded into the page as part of the load,
# it returns the full path in `boot_js`
def boot_js
File.expand_path('runner_boot.js', __FILE__)
end
end
Jasmine 团队还维护一个自定义运行器,该运行器使用 Selenium(必要时还使用 SauceLabs)与其他浏览器一起运行规格。 Jasmine Selenium 运行器