我正在学习Rails这个古老的方式.通过阅读Agile Web Development with Rails(第3版)作为起点.我目前正在教授测试的章节.我也知道其他BDD测试框架,如RSPec.所以我想知道RSpec,Cucumber,Shoulda等框架是否取代了知道/使用Test :: Unit的需要?它们本身是否相关并用于不同目的?
更新:由于我是测试的新手,我也希望获得有关哪些资源对于使用不同框架的方式有用的反馈.
谢谢!
我经常运行各种测试组,如:
rake test:units
rake test:functionals
Run Code Online (Sandbox Code Playgroud)
我还想运行单独的测试文件或单独的测试:
ruby -Itest test/unit/file_test.rb
ruby -Itest test/unit/file_test.rb -n '/some context Im working on/'
Run Code Online (Sandbox Code Playgroud)
还有:
rake test TEST=test/unit/file_test.rb
Run Code Online (Sandbox Code Playgroud)
我甚至在我的Rakefile中创建了自定义分组:
Rake::TestTask.new(:ps3) do |t|
t.libs << 'test'
t.verbose = true
t.test_files = FileList["test/unit/**/ps3_*_test.rb", "test/functional/services/ps3/*_test.rb"]
end
Run Code Online (Sandbox Code Playgroud)
我还没想到的是如何在命令行运行多个临时测试.换句话说,我如何将test_files注入rake任务.就像是:
rake test TEST=test/unit/file_test.rb,test/functional/files_controller_test.rb
Run Code Online (Sandbox Code Playgroud)
然后我可以运行一个带有任意参数的shell函数并运行快速ruby -Itest单一测试,或者rake如果有多个文件则执行任务.
我正在尝试在Ruby on Rails中使用Test :: Unit和Shoulda设置Factory Girl.我已经安装了gem,在test/factories目录下创建了我的工厂文件,并在test/models目录下创建了我的spec文件.我得到的当前错误是'ArgumentError:No such factory:test',这让我相信test_factory.rb文件没有被加载?知道我应该改变什么?
这是我的文件.
#test/factories/test_factory.rb
Factory.define :test do |t|
t.name 'test_spotlight'
t.label 'test spotlight label'
end
Run Code Online (Sandbox Code Playgroud)
和
#test/modes/test_spec.rb
require 'test_helper'
require 'factory_girl'
class TestTest < Test::Unit::TestCase
def setup
@test = Factory.build(:test)
end
context "A test" do
should "save with the minimum requirements" do
assert @test.save
end
end
end
Run Code Online (Sandbox Code Playgroud) 我希望在我的开发环境中有单元测试输出颜色.但是,我无法在Linux(Debian和Ubuntu)上运行它.当我包含以下库时:
require 'minitest/autorun'
require 'minitest/unit'
require 'minitest/pride'
Run Code Online (Sandbox Code Playgroud)
我明白了:
/usr/local/rvm/gems/ruby-1.9.2-p136/gems/minitest-2.3.1/lib/minitest/pride.rb:35:in `<top (required)>': undefined method `output' for MiniTest::Unit:Class (NoMethodError)
Run Code Online (Sandbox Code Playgroud)
由代码引起:
MiniTest::Unit.output = PrideIO.new(MiniTest::Unit.output)
Run Code Online (Sandbox Code Playgroud)
我见过一个有效的Rspec变种.不幸的是,我的Ruby知识还不足以看出差异.
在Java中,通常您将创建两个源文件夹src并test具有相同的包层次结构.
在Ruby中,您是否只将所有测试放在与测试类相同的文件夹中?或者您是否在单独的文件夹中创建类似的层次结构?如果是这样,您如何管理require单元测试中的路径?
我正在测试一些Ruby代码并且有一个失败的Test :: Unit :: TestCase.不幸的是,失败报告只给出了最大的错误,而不是完整的堆栈跟踪.具体来说,它说:
1) Failure:
test_tp_make(TestScripts::TestTpMake) [test/test_scripts.rb:73]:
Exception raised:
<#<NoMethodError: undefined method `[]' for nil:NilClass>>.
Run Code Online (Sandbox Code Playgroud)
引用的行号(73)是我测试用例中assert_nothing_raised代码块的开始,后者又启动另一个代码块,后者又调用大型库.
我尝试使用--verbose标志运行测试,遗憾的是这不会更改异常输出.我试着咨询了测试::单位的文件,但它似乎不枚举可用选项(例如,没有什么有用的在这里).搜索Web和StackOverflow表明了如何在Rails中启用堆栈跟踪的一些答案,但这是非Rails ruby代码.
我可以从测试中提取失败的代码并在Test :: Unit之外运行它,使我能够看到所有的输出.但是每次测试失败都会很痛苦.
有谁知道如何让Test :: Unit给我一个完整的堆栈跟踪?
我有一个单元测试(例子是修改Test :: Unit文档)
require 'test/unit'
class TC_MyTest < Test::Unit::TestCase
def test_something
assert(true)
end
end
Run Code Online (Sandbox Code Playgroud)
当我执行它时,我得到:
Loaded suite C:/test
Started
.
Finished in 0.0 seconds.
1 tests, 1 assertions, 0 failures, 0 errors
Run Code Online (Sandbox Code Playgroud)
我想得到这样的东西(test_something输出):
Loaded suite C:/test
Started
test_something
.
Finished in 0.0 seconds.
1 tests, 1 assertions, 0 failures, 0 errors
Run Code Online (Sandbox Code Playgroud) 你能从irb中执行assert_equal吗?这不起作用.
require 'test/unit'
assert_equal(5,5)
Run Code Online (Sandbox Code Playgroud) 我想在给定特定参数值时使用Mocha存根方法,并在给出任何其他值时调用原始方法.
当我这样做时:
MyClass.any_instance.stubs(:show?).with(:wanne_show).returns(true)
Run Code Online (Sandbox Code Playgroud)
我得到了
unexpected invocation for MyClass.show?(:other_value)
Run Code Online (Sandbox Code Playgroud)
我也知道,在没有'with'调用的情况下编写模拟时我可以存根所有参数,然后给出我特定的模拟.但是我必须知道每次通话的返回值,但事实并非如此:/
tldr; 有没有办法在存根中调用原始方法或只存储特定参数并留下其他参数?
从Rails 3.2升级到Rails 4后,我的应用程序正常运行,但我的测试用测试单元编写,是一场灾难.
据传Minitest与测试单元"兼容".但是,如果我尝试使用(现在捆绑的)Minitest,那么存在一系列差异 - 从assert*语句名称和参数到(很明显)许多其他东西既大又微妙.
如果我试图避免使用Minitest并尝试将我的测试单元gem保留在我的Gemfile中,则rake测试会爆炸,说,
undefined method 'refute_predicate' for class 'ActiveSupport::TestCase'
Run Code Online (Sandbox Code Playgroud)
这是因为已经打电话
require 'rails/test_help'
Run Code Online (Sandbox Code Playgroud)
:(
我一直在寻找,但还没有想出任何继续使用测试单元的方法.唯一的替代方案似乎是(对我们来说,大规模)重构我们的测试代码,因为我们80%的测试都会以某种方式破坏,或者Minitest与测试单元的不兼容性.
然而阅读http://weblog.rubyonrails.org/2013/6/25/Rails-4-0-final/和http://edgeguides.rubyonrails.org/upgrading_ruby_on_rails.html#upgrading-from-rails-3- 2-to-rails-4-0我发现实质上没有提到这一点 - 我觉得必须遗漏一些东西.
是否有可能使Minitest更系统地与测试单元兼容?或者继续在Rails 4中使用测试单元?
testunit ×10
ruby ×9
minitest ×2
rspec ×2
shoulda ×2
unit-testing ×2
cucumber ×1
factory-bot ×1
mocha.js ×1