我是rspec测试的新手。我需要编写测试代码来创建新记录并检查计数是否为1.
我将rails与ios app集成。
在我的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,则测试正在通过。请让我知道,我正走在正确的道路上吗?如果没有,建议任何其他选择。
答案 0 :(得分:1)
一些事情:
params[:user][:name]
的值,因此@name
为零,因此永远不会到达User.new
的行。User.count
永远不会更改。@name
变量实际上不是名称,而是User
个实例(如果找到)。您可能希望使用User.find_or_create_by
,因为Yevgeniy提到。这意味着做类似的事情:
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)
答案 1 :(得分:0)
unless @name
user = User.new("email" => params[:user][:email])
end