abe*_*gbg 3 rspec ruby-on-rails factory-bot
我想问题是我不知道如何正确使用Rspec的工厂女孩.或者正确地测试导轨.仍然认为它有点奇怪..
我有一个类,User,有以下工厂:
FactoryGirl.define do
factory :user do
name "admin"
email "admin@admin.com"
adminstatus "1"
password "foobar"
password_confirmation "foobar"
end
factory :user_no_admin, class: User do
name "user"
email "user@user.com"
adminstatus "2"
password "foobar"
password_confirmation "foobar"
end
...
Run Code Online (Sandbox Code Playgroud)
我的测试看起来像这样:
...
describe "signin as admin user" do
before { visit login_path }
describe "with valid information" do
let(:user_no_admin) { FactoryGirl.create(:user_no_admin) }
let(:user) { FactoryGirl.create(:user) }
before do
fill_in "User", with: user.name
fill_in "Password", with: user.password
click_button "Login"
end
it "should list users if user is admin" do
response.should have_selector('th', content: 'Name')
response.should have_selector('td', content: user_no_admin.name)
response.should have_selector('td', content: user.name)
end
end
end#signin as admin user
...
Run Code Online (Sandbox Code Playgroud)
基本上我试图测试,如果您以管理员身份登录,您应该看到所有用户的列表.我有一个测试,以便稍后在文件中以非管理员身份登录.我已经在db中有几个用户了.
在用户'admin'列表中,已显示已登录的用户以及已在db中的用户.但是,除非我之前做过类似的事情,否则不会显示'user':
fill_in "User", with: user_no_admin.name
fill_in "Password", with: user_no_admin.password
Run Code Online (Sandbox Code Playgroud)
除非我使用它,否则它将不会存在.但是,如果我使用put它会打印我正在输入的信息,即使我没有执行上面的'fill_in'.
我有一个类似的例子,其中一个帮助我.
describe "should have company name" do
let(:company) { FactoryGirl.create(:company) }
let(:category) { FactoryGirl.create(:category) }
let(:company_category) { FactoryGirl.create(:company_category, company_id: company.id, category_id: category.id) }
it "should contain companies name" do
puts company_category.category_id
get 'categories/' + company.categories[0].id.to_s
response.should have_selector('h4', :content => company.name)
end
end
Run Code Online (Sandbox Code Playgroud)
没有上面的提示,我得到一个
Called id for nil
Run Code Online (Sandbox Code Playgroud)
在我以某种方式使用之前,我是否必须启动(?)Factory女孩创建的对象?
还需要其他代码吗?
let(:whatever)
Run Code Online (Sandbox Code Playgroud)
直到第一次调用它们时才创建对象.如果您希望在首次使用之前使用它,请使用
let!(:whatever)
Run Code Online (Sandbox Code Playgroud)
代替.
或使用之前的块:
before(:each) do
@company = FactoryGirl.create(:company)
....
end
Run Code Online (Sandbox Code Playgroud)
这将在您需要使用它们之前创建对象.
| 归档时间: |
|
| 查看次数: |
3208 次 |
| 最近记录: |