什么被认为是一个很好的规范? Rspec初学者的例子
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么被认为是一个很好的规范? Rspec初学者的例子相关的知识,希望对你有一定的参考价值。
什么被认为是一个坚实的规范?
这是我发现测试非常抽象的内容。我对模型,控制器和其他任何可以测试的答案感兴趣。有一个规范的规格会很酷,你知道我的意思吗?
模型规范应该(按优先级和相关性顺序):
- 测试所有方法?
- 测试错误数组?
- 测试CRUD(以及如何)?
- 还有什么?
控制器/视图规范应该(按优先级/相关性顺序):
- 填空...
- ?
很高兴扩展这个规范应该和不应该包含的列表。
我还想编制一系列技巧和建议。例如:
关键字“应该”是多余的。
例:
这个:
it "should be invalid without a firstname"
会更好:
it "is invalid without a firstname"
另一个技巧是,使用expect而不是lambda来提高可读性:
lambda { ... }.should be_valid
更具可读性:
expect { ... }.should be_valid
我正在编写有关入门的有用文章列表,并将在这篇文章中分享这些文章。以下是我发现现在特别有用的一些内容。 (随意张贴你的,如果看起来有帮助,我会把它贴上)。
http://everydayrails.com/2012/03/19/testing-series-rspec-models-factory-girl.html http://nelvindriz.tumblr.com/post/835494714/rspec-best-practices
如果有一个项目列表可以很好地实现测试,那就太棒了。由于rspec是如此可读(至少每个人都这么说),所以获得一个指向具有很好规格的项目的链接列表会很棒。
“请参阅Mongoid specs以获得良好规格的示例。” - @ yfeldblum(见下面的答案)
在线你会发现很多文章描述了关于如何测试基本内容的不切实际的场景,但除此之外,你还可以自己分类。如果我要写一篇关于这个主题的文章,我会链接到我的测试(例如在github上),然后彻底注释其中一个或几个规范...这似乎是写一篇关于rspec的文章的最好方法,在我看来。我自己做,但我还没到那里。
如果你投票结束这个,那很好,只是试着留下你认为这篇文章所属的评论或建议。谢谢!
这实际上是一个很好的问题,因为当我开始使用测试用例时,我不确定什么是一个好的测试用例。以下是您可以遵循的一些事项。这份清单不是我的;但是从一些来源加上我的一些补充。
描述方法
在描述方法时,实际描述您的方法是一种很好的做法:描述“#admin?”等。“。”是类方法的前缀,“#”是实例方法的前缀。
每个测试用例一个断言
确保每个测试用例只有一个断言。这可以确保您的测试用例干净且易于理解;这是测试用例的重点,不是吗? :)
避免将数据保存到db
您可以动态构建对象并避免将数据保存到db。虽然您可以在每个测试用例之前清理数据库,但“不保存”将大大加快测试用例的速度。
@ user.build(:something)而不是@ user.create(:something)
边缘和无效的情况
这不是Rspec特有的,但确保测试中包含边缘情况非常重要。这有助于您的项目何时增长并且易于维护。
contexting
我个人在Rspec中经常这样,事实上我过度使用了上下文。使用具有条件的上下文有助于划分测试用例。这是一个例子:
# Avoid
it "should have 200 status code if user is logged in" do
response.should respond_with 200
end
it "should have 401 status code if user is not logged in" do
response.should respond_with 401
end
# Use
context "when user is logged in" do
it { should respond_with 200 }
end
context "when user is logged out" do
it { should respond_with 401 }
end
使用主题
当你有很多与同一事物有关的测试用例时,你可以使用subject()来确保你不重复自己。
# Avoid
it { assigns(:user).should be_valid }
it { assigns(:user).should_not be_dumb }
it { assigns(:user).should be_awesome }
# Use
subject { assigns("user") }
it { should be_valid }
it { should_not be_dumb }
it { should be_awesome }
在编写测试用例时,我尝试遵循以下几点。我相信还有很多东西可以改善Rspec测试用例。但这应该足以开始并编写出色的测试用例。
有关良好规格的示例,请参阅Mongoid specs。
- 每个例子只有一个断言。不要在同一个例子中断言两件事。一个例子是传递给
it
,its
或specify
的块。
我正在学习Ruby on Rails的教程,并且正在将Rspec作为测试驱动开发的一部分进行教学。这里的流程是编写一个失败的测试,编写代码以通过测试,然后通过测试。理由似乎是通过这样做 - 从一个失败的测试开始 - 你可以非常确定你的代码符合你的期望。因此,我认为一个好的规范可以确保您的代码能够实现预期的功能。到目前为止,我没有像其他海报所写的那样从教程中收集任何经验法则。
这是链接:http://ruby.railstutorial.org/
在编写控制器测试时,您希望在控制器中测试所有操作。
示例控制器操作的测试应如何:
describe "Stories" do
describe "GET stories#index" do
context "when the user is an admin" do
it "should list titles of all stories"
end
context "when the user is not an admin" do
it "should list titles of users own stories" do
end
end
describe "GET stories#show" do
it "should render stories#show template" do
end
end
describe "GET stories#new" do
it "should render stories#new template" do
end
end
describe "POST stories#create" do
context "with valid attributes" do
it "should save the new story in the database"
it "should redirect to the stories#index page"
end
context "with invalid attributes" do
it "should not save the new story in the database"
it "should render stories#new template"
end
end
describe "DELETE stories#delete" do
it "should delete the story from the database"
it "should redirect to the stories#index page"
end
end
你可以找到更多关于controller tests here的信息。
以上是关于什么被认为是一个很好的规范? Rspec初学者的例子的主要内容,如果未能解决你的问题,请参考以下文章
RSpec 失败是因为它认为 ActiveRecord 对象不相等