1

我是 rspec 测试的新手。我需要编写测试代码来创建新记录并检查计数是否为 1。

我正在将 rails 与 ios 应用程序集成。

在我的registration_controller

@name = User.find_by_name(params[:user][:name]])
#params[:user][:name]] value from ios app
if !@name.nil?
    user = User.new("email" => params[:user][:email])        
end

在我的registration_controller_spec

 expect {
        post :create, {:user => { 'email' => 'xxx@yyy.com'}}
    }.to change(User, :count).by(1)

控制器中的 if 条件不允许我通过测试。

Failure/Error: expect {
   count should have been changed by 1, but was changed by 0

如果我在控制器中为 @name 分配任何样本值,则测试通过。请让我知道,我是否走在正确的道路上?如果没有,建议任何其他替代方案。

4

2 回答 2

1

几件事:

  1. 您的测试没有提供 的值params[:user][:name],所以@name是 nil,因此User.new永远不会达到与的行。
  2. 您永远不会真正保存您实例化的用户,这意味着User.count永远不会改变。
  3. @name变量不是真正的名称,而是一个User实例(如果找到)。

您可能想像User.find_or_create_byYevgeniy 提到的那样使用。这意味着做类似的事情:

user = User.find_or_create_by(:name => params[:user][:name]) do |user|
  user.email = params[:user][:email]
end

为了让它真正起作用,你可能希望你的测试能够阅读

expect {
  post :create, {:user => {'name' => 'Mr. xxx', 'email' => 'xxx@yyy.com'}}
}.to change(User, :count).by(1)
于 2013-09-19T07:53:54.757 回答
0
unless @name
  user = User.new("email" => params[:user][:email])        
end
于 2013-09-19T06:58:52.490 回答