这个项目是
https://github.com/chucai/Ruby-on-Rails-Tutorial-by-Michael-Hartl--v3.2-
有比较网站的Rails测试代码,项目比较小,只有三张表,但是代码结构简单,思路清晰,有非常多的值得借鉴和学习的地方。
所有做了这个研究笔记。
1. 实现的功能有:
• 集成了cucumber 和 rspec测试
• 自己定义的用户认证[没有使用devise]
• 简单的微博类型的跟随
• 简单的micropost提交
• 使用了bootstrap 框架
这个小系统所具备的功能有:
1, 登录与注册
2, 跟随某人
3, 个人首页
4, 写微博
2. 如何在where中使用占用符?
private
# Returns an SQL condition for users followed by the given user.
# We include the user's own id as well.
def
self.followed_by(user)
followed_user_ids = %(
SELECT followed_id
FROM relationships
WHERE follower_id =
:user_id)
where(
"user_id IN (#{followed_user_ids}) OR user_id = :user_id",
{ user_id: user })
end
rspec中的subject , it 使用实例
let(
:follower) {
FactoryGirl.create(
:user) }
let(
:followed) {
FactoryGirl.create(
:user) }
let(
:relationship)
do
follower.relationships.build(followed_id: followed.id)
end
subject { relationship }
it { should be_valid }
describe
"follower methods"
do
before { relationship.save }
it { should respond_to(
:follower) }
it { should respond_to(
:followed) }
its(
:follower) { should == follower }
its(
:followed) { should == followed }
end
subject 是it 后默认的变量
its(
:symbol) 是从 let 中取值
css选择器 选择页面中的元素
it { should have_selector(
'h1', text: heading) }
3. rspec如何就行ajax测试
it
"should decrement the Relationship count"
do
expect
do
xhr
:delete,
:destroy, id: relationship.id
end.should change(
Relationship,
:count).by(-
1)
end
4. 如何写cucumber的测试用例,如下的代码可以参考
Feature:
Signing
in
Scenario:
Unsuccessful signin
Given a user visits the signin page
When he submits invalid signin information
Then he should see an error message
Scenario:
Successful signin
Given a user visits the signin page
And the user has an account
And the user submits valid signin information
Then he should see his profile page
And he should see a signout link
定义了两个场景, 注册成功和注册失败, 如下是step文件
Given
/^a user visits the signin page$/
do
visit signin_path
end
When
/^he submits invalid signin information$/
do
click_button
"Sign in"
end
Then
/^he should see an error message$/
do
page.should have_selector(
'div.alert.alert-error')
end
Given
/^the user has an account$/
do
@user =
User.create(name:
"Example User", email:
"[email protected]",
password:
"foobar", password_confirmation:
"foobar")
end
When
/^the user submits valid signin information$/
do
visit signin_path
fill_in
"Email", with:
@user.email
fill_in
"Password", with:
@user.password
click_button
"Sign in"
end
Then
/^he should see his profile page$/
do
page.should have_selector(
'title', text:
@user.name)
end
Then
/^he should see a signout link$/
do
page.should have_link(
'Sign out', href: signout_path)
end