2016-08-20 57 views
1

运行测试时,如果尝试使用User.new创建新对象,则出现错误。如果相反,我使用User.new({}),它工作正常。ActiveModel ::初始化没有参数的类时出现的模型错误

如果没有传入,params是否应该默认为空?

$ rails -v

Rails 5.0.0.1

user.rb

class User 
    include ActiveModel::Model 

    attr_accessor :name, :email, :country 
end 

user_test.rb

require 'test_helper' 
class User < ActiveSupport::TestCase 

    test "should create an empty user when initialized with no params" do 
    user = User.new 
    assert_not_nil(user, 'user cannot be empty') 
    end 
end 

测试结果

Error: 
User#test_should_create_an_empty_user_when_initialized_with_no_parameters: 
ArgumentError: wrong number of arguments (given 0, expected 1) 
    test/models/user_test.rb:7:in `new' 
    test/models/user_test.rb:7:in `block in <class:User>' 
+0

当您在Rail控制台中执行User.new时会发生什么?你在user.rb中有初始化方法吗? – margo

+0

你确定'test'中的'User'是用户*模型*而不是用户*测试*? –

+0

有时,你只需要有人指出明显的,谢谢@DaveNewton – pameck

回答

0

一般来说,attr_accessor上的模型用于不在SQL表的实际列列。

因此,如果您的模型有:name,:email:country列,则声明attr_accessor是不必要的。我认为铁轨正在等待你现在宣布他们。

尝试注释掉attr_accessor :name, :email, :country一行,然后重新运行测试。

+0

感谢您的快速反应,我试图取消它的注释,但没有奏效。 无论如何,'attr_accessor'只是给getter和setter类的Ruby方法。根据[ActiveModel :: Model doc](http://api.rubyonrails.org/classes/ActiveModel/Model.html) – pameck

0

这可能有助于

而是包括模型类扩展它喜欢:

class Crime < ApplicationRecord 
//do your stuff here 
end 

然后你可以使用@user = User.new

+0

这似乎不是一个问题。这只是一个错误,命名测试完全像该模型。 将测试名称从'User'更改为'UserTest',并且它都是固定的。 谢谢你的回应! – pameck

0

User你在引用测试本身就是测试。

最简单的解决方案是遵循Ruby约定并命名测试类UserTest

+0

不时,你只需要有人指出明显的,谢谢。 – pameck

相关问题