【问题标题】:Find a newly created record in a controller test using RSpec 3 and Rails 4使用 RSpec 3 和 Rails 4 在控制器测试中查找新创建的记录
【发布时间】:2015-09-23 04:47:11
【问题描述】:

我在 Rails 4 中做一个控制器规范,我想测试由控制器操作创建的记录的属性。如何找到新创建的记录?

例如,我可以做什么来代替

it 'Marks a new user as pending' do
  post :create, params
  # I don't want to use the following line
  user = User.last
  expect(user).to be_pending
end

Rails guides 仅简要介绍了控制器测试,其中提到了测试 Article.count 变化 1,但没有提到如何获得新的 ActiveRecord 模型。

Find the newest record in Rails 3 的问题是关于 Rails 3。

我不愿意使用User.last,因为默认排序可能不是创建日期。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 rspec actioncontroller rspec3


    【解决方案1】:

    如果控制器有一个名为@user的实例变量,那么我们可以通过assigns(:user)在RSpec中访问它。

    【讨论】:

    • 我有点担心这会破坏封装。
    【解决方案2】:

    在控制器测试中比较 recordsobjects 不是一个好主意。在控制器create 测试中,您应该测试正确的重定向和记录的更改。

    您可以在模型测试中轻松compare 您的对象,因为您可以轻松跟踪您的记录。

    不过,如果您的 actionvariable 包含 record 之类的 variable,您仍然可以从测试中访问创建的记录

    在控制器中

     def create 
       @user = #assign user
     end
    

    测试中

    assigns(:user).name.should eq "Name" # If it has a name attribute
    assigns(:user).pending.should be_true # I don't know how you implemented pending
    

    你可以看看this article

    【讨论】:

    • 我的意思是您可以将record 分配给variable,然后可以使用variable 进行操作,例如。 let(:user) { Fabricate.build :user } 现在 user 将在您的示例中可用,您可以操作 user 例如。 expect(user.disabled?).to be_true
    • 我已尝试修正您答案的语法。我是否无意中改变了任何含义?另外,“并测试记录的变化”是指测试单个记录是否发生变化,还是测试记录数量是否发生变化?
    • 谢谢,对不起我的英语不好,我已经编辑了这行,我想我现在会更容易理解了:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多