更改rspec测试以检查字符串,而不是布尔值

时间:2014-01-26 11:25:55

标签: ruby-on-rails rspec

我有一个问题,了解MHartls教程中代码的特定部分来自哪里(因此我似乎无法改变它以更好地满足我的需求......)我所谈论的部分是一个rspec测试:

describe "delete links" do

  it { should_not have_link('delete') }

  describe "as an admin user" do
    let(:admin) { FactoryGirl.create(:admin) }
    before do
      sign_in admin
      visit users_path
    end

    it { should have_link('delete', href: user_path(User.first)) }
    it "should be able to delete another user" do
      expect do
        click_link('delete', match: :first)
      end.to change(User, :count).by(-1)
    end
    it { should_not have_link('delete', href: user_path(admin)) }
  end

现在,测试检查用户的admin属性是true还是false。我试图检查用户的角色属性是否包含“管理员”一词。该模型正在运行,视图正确显示所有内容 - 但我不知道如何重写测试,现在它失败了。

让我困惑的一个部分是“sign_in admin”和“user_path(admin)” - 这是从哪里来的? rspec如何知道管理员是谁? 如果它是某个定义的属性,如果角色是管理员,我可以简单地将它从admin = true / false更改为admin是真的吗?

非常感谢你的帮助!

更新:

我有一个名为factories.rb的文件,这里是根据Mhartls教程的内容:

FactoryGirl.define do
  factory :user do
    sequence(:name)  { |n| "Person #{n}" }
    sequence(:email) { |n| "person_#{n}@example.com"}
    password "foobar"
    password_confirmation "foobar"

    factory :admin do
      admin true
    end
  end
end

我尝试将其更改为:

FactoryGirl.define do
  factory :user do
    sequence(:first_name)  { |n| "First #{n}" }
    sequence(:last_name)  { |n| "Last #{n}" }
    sequence(:primary_email) { |n| "person_#{n}@example.com"}
    password "foobar"
    password_confirmation "foobar"

    factory :role do
      role "Administrator"
    end
  end
end

回应您的评论的其他信息:

  • 我没有使用Devise - 用户模型是基于railstutorial构建的,只需稍加修改(更多表单字段加上admin字段在我的情况下是一个带字符串的字段“role”)
  • 很清楚user_path是什么 - 但为什么后面有(管理员)呢?
  • 我正在尝试准确测试测试中的内容 - 问题是FactoryGirl使用admin属性设置为true的用户进行测试。

总结一下:

我不想改变测试测试的内容 - 我只想改变管理员如何通过工厂女性识别。现在它测试属性“admin”是否设置为true或false。我希望它检查属性“role”是否具有内容“Administrator”

1 个答案:

答案 0 :(得分:0)

我认为您可能会对您在测试中需要做什么以及在生产代码中需要做什么感到困惑。

如果您改变了FactoryGirl(:admin)的定义,那么您的测试就可以了。

但是,您需要更改生产代码,以便根据role定义“admin-ness”,并且您没有提及。