Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 工厂女孩没有启动对象_Ruby On Rails_Rspec_Factory Bot - Fatal编程技术网

Ruby on rails 工厂女孩没有启动对象

Ruby on rails 工厂女孩没有启动对象,ruby-on-rails,rspec,factory-bot,Ruby On Rails,Rspec,Factory Bot,我想问题是我不知道如何正确使用带有Rspec的factory girl。或者在rails中正确地进行测试。但我还是觉得有点奇怪 我有一个类User,具有以下工厂: FactoryGirl.define do factory :user do name "admin" email "admin@admin.com" adminstatus "1" password "foobar" password_confirmation "fooba

我想问题是我不知道如何正确使用带有Rspec的factory girl。或者在rails中正确地进行测试。但我还是觉得有点奇怪

我有一个类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
...
我的测试如下所示:

...
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
...
基本上,我正在尝试测试,如果您以管理员身份登录,您应该会看到所有用户的列表。我在文件中有一个非管理员登录的测试。我已经在数据库中有几个用户了

在用户列表中,登录的“admin”与数据库中已有的用户一起显示但是,除非我以前执行过类似操作,否则不会显示“用户”:

fill_in "User",    with: user_no_admin.name
fill_in "Password", with: user_no_admin.password
除非我使用它,否则它就不会存在。但是,如果我使用puts,它会打印我输入的信息,即使我没有进行上面的“填写”

我有一个类似的例子,一个看跌期权可以帮助我

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
如果没有上面的puts,我会得到一个

Called id for nil
我必须先启动工厂女孩创建的对象,然后才能以某种方式使用它吗

需要其他代码吗?

而不是:

factory :user do
  name     "admin"
  email    "admin@admin.com"
  ...
let(:user_no_admin) { FactoryGirl.create(:user_no_admin) }
let(:user) { FactoryGirl.create(:user) }
我会:

factory :user do |f|
  f.name "admin"
  f.email "admin@admin.com"
  ...
@user_no_admin = Factory(:user_no_admin)
@user = Factory(:user)
而不是:

factory :user do
  name     "admin"
  email    "admin@admin.com"
  ...
let(:user_no_admin) { FactoryGirl.create(:user_no_admin) }
let(:user) { FactoryGirl.create(:user) }
我会:

factory :user do |f|
  f.name "admin"
  f.email "admin@admin.com"
  ...
@user_no_admin = Factory(:user_no_admin)
@user = Factory(:user)
直到第一次调用对象时才创建对象。如果您希望在首次使用前可用,请使用

let!(:whatever)
相反

或者使用before块:

before(:each) do
  @company = FactoryGirl.create(:company)
  ....
end

这将在您需要使用它们之前创建对象。

我在一个已中断的现有测试中遇到了类似的问题,原因稍有不同,这很有趣

在本例中,被测控制器最初调用的是
save
,但我将其更改为调用
save,并相应地更新了测试

修订后的测试是:

  • 将实例声明为
    let
    语句
  • 设置保存的期望值!方法(例如,
    期望(MyObject.)的任何实例接收(:save!)
  • 在期望之后第一次使用实例
在内部,FactoryGirl似乎正在调用
save方法,并将期望值从保存更改为保存!,实际上没有完成任何工作(并且测试中的代码无法从数据库中找到实例)

我需要更新,并且在没有黑客攻击的情况下很难真正通过测试)

尝试在工厂女孩中使用trait,有一个例子,正如在

中提到的那样,当执行@user\u no\u admin=factory(:user\u no\u admin)时,它在数据库中创建它们,下次尝试创建它们时,我会得到一个无效的记录。也许一个before块可以解决这个问题。你可以在创建时执行before(:each)块,然后执行after(:each)@user.destroy为了避免每次执行“after eachs destroys”,你可以将它添加到spec\u helper:config.before(:each)do Sham.reset(:before\u each)end某天我会擅长测试,然后我的生活会很美好。谢谢你,阿德里安!请不要链接到其他网站,除非您使用它们来备份此处编写的代码和信息。你需要扩展你的答案,使之更合适