使用添加的rspec-rails生成器来设置RSpec以测试Rails应用程序非常容易.但是如何添加RSpec来测试开发中的宝石?我不是在使用珠宝商或这样的工具.我只是使用Bundler(bundle gem my_gem)来设置新gem的结构并手动编辑*.gemspec.我还加入s.add_development_dependency "rspec", ">= 2.0.0"了gemspec并做了一个bundle install.
是否有一些很好的教程,接下来要做什么让RSpec工作?
我已经test-unit安装和rspec安装(沿-core,-expectations,-mocks和-rails版本2.6.x的).当我运行该命令时rails new foo,它用于test-unit生成测试存根文件而不是rspec.
有没有一个选项,我可以告诉rails使用rspec来生成测试?
describe,context,feature,scenario:什么是四间的差异(一个或多个),做当我使用每一个?
现在,如果我使用我的测试套件rake spec我得到一个错误:
1) SegmentsController GET 'index' should work
Failure/Error: get 'index'
undefined method `locale' for #
# ./spec/controllers/segments_controller_spec.rb:14:
in `block (3 levels) in '
这是正常的,因为我有一个错误:)
问题是跟踪不是很有帮助.我知道它突破了segments_controller_spec.rb,第14行,但这只是我称之为测试的地方:
### segments_controller_spec.rb:14
get 'index'
Run Code Online (Sandbox Code Playgroud)
我更喜欢实际的断行和完整的跟踪,而不是spec文件夹中的部分.
跑步--trace并没有帮助.
经过重大故障排除后,我发现我需要运行rake spec一次(我可以使用control-c中止),然后才能直接运行rspec(例如,在我们规范的子集上).我们正在运行Rails 3.0.7和RSpec 2.5.0.
显然,rake正在运行一些重要的数据库设置任务/代码(我们在根级别Rakefile和其他地方都有自定义代码).
如何在不运行的情况下运行rake测试数据库设置任务/代码rake spec?
除了能够在一个文件子集上运行rspec之外,我还使用specjour在多个核心上传播我们的规范(尚未成功将它们传播到局域网中),但我看到了与运行rspec相同的行为直接:我需要rake spec在specjour工作之前在每个测试数据库上运行(假设有两个核心):
rake spec TEST_ENV_NUMBER=1
control-c (after tests start)
rake spec TEST_ENV_NUMBER=2
control-c (after tests start)
specjour
Run Code Online (Sandbox Code Playgroud)
注意:我的config/database.yml有这个测试条目(对于并行测试宝石来说很常见):
test:
adapter: postgresql
encoding: unicode
database: test<%=ENV['TEST_ENV_NUMBER']%>
username: user
password:
Run Code Online (Sandbox Code Playgroud)
parallel_tests似乎正确设置了它的数据库,但我们的许多规范都失败了.
我还应该提一下,运行specjour prepare会导致Postgres记录它无法找到数据库的错误,但它会创建它们(没有表).在后续运行中,不会记录任何错误,也不会创建任何表.我的整个问题可能只是一个错误prepare,所以我在github上报告了它.
我认为我可以通过设置Specjour::Configuration.prepare.specjour/hooks.rb 在每个specjour测试数据库上运行任意代码,所以如果有任何rake任务或我需要运行的其他代码,它可能在那里工作.
以下代码按预期工作:
Object.any_instance.should_receive(:subscribe)
Run Code Online (Sandbox Code Playgroud)
但是当使用新的rspec期望时,它不起作用:
expect(Object.any_instance).to receive(:subscribe)
Run Code Online (Sandbox Code Playgroud)
错误是:
expected: 1 time with any arguments
received: 0 times with any arguments
Run Code Online (Sandbox Code Playgroud)
如何使expect()接收?
我已经在Rails中使用TDD开始了我的旅程,并且遇到了一个关于模型验证测试的小问题,我似乎无法找到解决方案.假设我有一个用户模型,
class User < ActiveRecord::Base
validates :username, :presence => true
end
Run Code Online (Sandbox Code Playgroud)
和一个简单的测试
it "should require a username" do
User.new(:username => "").should_not be_valid
end
Run Code Online (Sandbox Code Playgroud)
这正确地测试了状态验证,但如果我想更具体一点怎么办?例如,在errors对象上测试full_messages.
it "should require a username" do
user = User.create(:username => "")
user.errors[:username].should ~= /can't be blank/
end
Run Code Online (Sandbox Code Playgroud)
我对初始尝试的关注(使用should_not be_valid)是RSpec不会产生描述性错误消息.它只是说"预期有效?返回虚假,变为现实".但是,第二个测试示例有一个小缺点:它使用create方法而不是new方法来获取errors对象.
我希望我的测试更具体地说明他们正在测试什么,但同时不必触摸数据库.
有人有任何意见吗?
你如何redirect_to :back在rspec中测试?
我明白了
ActionController::RedirectBackError:在此操作的请求中设置了
NoHTTP_REFERER,因此redirect_to :back无法成功调用.如果这是测试,请确保指定request.env["HTTP_REFERER"].
我如何设置HTTP_REFERER我的测试?
有一个可怕的时间找到RSpec-2(和rspec-rails)文档.具体来说,我想查找所有可用的Matchers ......但是怎么样?
我试过了:
是的,我知道The Book ...但是,严肃地说,这不是网上的东西吗?
即使尝试rake doc:plugins但它没有奏效.太绿了,知道为什么......
显然,在rspec.rubyforge.org上曾经有过一些不错的1.x文档.但它们似乎早已不复存在......
这些文档隐藏在哪里?
在Ruby中开发gem时,我几乎总是需要一个文件,我可以在其中配置RSpec以满足我的需要,也许在此之前,需要一些辅助模块,这些模块应该在我的所有spec示例中都可用.
在Rails应用程序中,使用名为的文件spec/spec_helper.rb.令我恼火的一件事是,在典型的Rails环境中,您必须在每个包含要加载示例的文件中要求此spec_helper.rb文件.在过去,我遇到了很多问题,这些问题与更改示例文件中的加载路径和相对需求路径有关.
现在,对于我的宝石,我希望有一种方法可以在加载任何示例文件之前说RSpec要求spec_helper.rb文件.如果我调用rspec可执行文件,或者我可以在我的Rakefile中定义的rake规范任务,则独立于这个事实.
我知道我只能告诉RSpec我的spec_helper.rb的位置是这个spec_helper.rb手动需要所有的示例文件,但我还想避免额外维护该方法.
有没有更好的方法来实现这一目标?