在控制器规范中,我可以像这样设置http接受标头:
request.accept = "application/json"
Run Code Online (Sandbox Code Playgroud)
但在请求规范中,"请求"对象为零.那我怎么能在这里做呢?
我想将http接受标头设置为json的原因是我可以这样做:
get '/my/path'
Run Code Online (Sandbox Code Playgroud)
而不是这个
get '/my/path.json'
Run Code Online (Sandbox Code Playgroud) 我们的一个(或几个)测试正在进行中,我们希望对它们进行优化.
我们已经说了1000次测试,所以我运行每个文件是不切实际的.
有没有一种容易找到慢速的方法?
这是rspec 1.3
我正在使用Ruby on Rails 4和rspec-rails gem 2.14.对于我的对象,我想updated_at在控制器动作运行后将当前时间与对象属性进行比较,但由于规范没有通过,我遇到了麻烦.也就是说,鉴于以下是规范代码:
it "updates updated_at attribute" do
Timecop.freeze
patch :update
@article.reload
expect(@article.updated_at).to eq(Time.now)
end
Run Code Online (Sandbox Code Playgroud)
当我运行上面的规范时,我收到以下错误:
Failure/Error: expect(@article.updated_at).to eq(Time.now)
expected: 2013-12-05 14:42:20 UTC
got: Thu, 05 Dec 2013 08:42:20 CST -06:00
(compared using ==)
Run Code Online (Sandbox Code Playgroud)
如何使规范通过?
注意:我还尝试了以下(注意utc添加):
it "updates updated_at attribute" do
Timecop.freeze
patch :update
@article.reload
expect(@article.updated_at.utc).to eq(Time.now)
end
Run Code Online (Sandbox Code Playgroud)
但规格仍然没有通过(注意"得到"的价值差异):
Failure/Error: expect(@article.updated_at.utc).to eq(Time.now)
expected: 2013-12-05 14:42:20 UTC
got: 2013-12-05 14:42:20 UTC
(compared using ==)
Run Code Online (Sandbox Code Playgroud) 我有6个月的Rails开发经验.我已经构建了一个现在正在使用的Web应用程序,它具有身份验证和授权以及postgresql db.
我正在继续我的第二个Rails应用程序,但这一次,经过经验教训,我想用TDD开发它,因为我注意到它更容易扩展它并修复bug.它发展缓慢,但从长远来看,它更容易处理.
我听说过Rspec和Cucumber,但他们完全被他们搞糊涂了.
我想知道RSpec和Cucumber之间的区别以及它们的用途.
从初学者(也是唯一的开发者)的角度来看,是否确实需要测试框架也是有用的.
从功能规范文档:
功能规范是用于通过应用程序执行功能切片的高级测试.他们应该只通过其外部接口(通常是网页)来驱动应用程序.
并根据要求规格:
请求规范提供了一个围绕Rails集成测试的瘦包装器,旨在通过完整堆栈驱动行为,包括路由(由Rails提供)而不是存根(由您决定).根据请求规范,您可以:
- 指定单个请求
- 跨多个控制器指定多个请求
- 在多个会话中指定多个请求
我知道功能规格使用Capybara并且请求规格没有.但这几乎不值得采用不同的概念.
我的测试中有这个
Project.should_receive(:find).with(@project).and_return(@project)
Run Code Online (Sandbox Code Playgroud)
但是当对象接收到该方法调用两次时,我必须这样做
Project.should_receive(:find).with(@project).and_return(@project)
Project.should_receive(:find).with(@project).and_return(@project)
Run Code Online (Sandbox Code Playgroud)
有什么方法可以说出类似的话
Project.should_receive(:find).with(@project).and_return(@project).times(2)
Run Code Online (Sandbox Code Playgroud) 在编写RSpec测试时,我发现自己编写了大量看起来像这样的代码,以确保在执行测试期间调用一个方法(为了论证,我们只能说我不能真正地查询状态调用后的对象,因为该方法执行的操作不容易看到效果).
describe "#foo"
it "should call 'bar' with appropriate arguments" do
called_bar = false
subject.stub(:bar).with("an argument I want") { called_bar = true }
subject.foo
expect(called_bar).to be_true
end
end
Run Code Online (Sandbox Code Playgroud)
我想知道的是:有比这更好的语法吗?我是否缺少一些时髦的RSpec非常棒,可以将上面的代码减少到几行?should_receive听起来它应该这样做但是进一步阅读它听起来并不完全是它的作用.
describe,context,feature,scenario:什么是四间的差异(一个或多个),做当我使用每一个?
我有一个测试规范,其中describes一个类和contexts每个类都有各种各样的it块.
有没有办法context暂时禁用?
我尝试pending "temporarily disabled"在context我要禁用的最顶层添加一个调用,当我运行规范时,我确实看到了一些关于暂挂的内容,但之后它继续运行其余的测试.
这就是我的方式:
describe Something
context "some tests" do
it "should blah" do
true
end
end
context "some other tests" do
pending "temporarily disabled"
it "should do something destructive" do
blah
end
end
end
Run Code Online (Sandbox Code Playgroud)
但就像我说的那样,它继续在待处理的呼叫下运行测试.
搜索引导我进入这个邮件列表线程,其中rspec的创建者(?)表示它可能在我正在运行的rspec 2中.我猜它确实有效,但它没有取消所有以下测试的预期效果,这就是我在看到一个pending电话时的想法.
有替代方案还是我做错了?
鉴于我Personable在我的Rails 4应用程序中有一个问题有一个full_name方法,我将如何使用RSpec进行测试?
关注/ personable.rb
module Personable
extend ActiveSupport::Concern
def full_name
"#{first_name} #{last_name}"
end
end
Run Code Online (Sandbox Code Playgroud) rspec ×10
ruby ×3
testing ×3
rspec-rails ×2
comparison ×1
cucumber ×1
json ×1
rspec2 ×1
tdd ×1
time ×1