我刚刚知道如何在模型用户上显示国家id号码中的国家名称。下面是我在一个控制器和两个视图中使用的基本代码,用于在根据用户的id找到用户后显示名称:
@country_name = Country.find(@user.country_id).name我使用Factory Girl来模拟用户记录,其中对于美国,country_id的默认值是1。在我添加这个逻辑之前,我的Rspec2测试是干净的。现在,当我运行测试时,我得到了以下错误。在视图或控制器中具有类似逻辑的每个测试都会产生错误。
ActiveRecord::RecordNotFound:
Couldn't find Country with id=1下面是我正在做的两个Rspec2测试:
describe "profile page" do
let(:user) { FactoryGirl.create(:user) }
before { visit user_path(user) }
it { should have_selector('span', text: user.first_name+' '+user.last_name) }
it { should have_selector('title', text: user.first_name+' '+user.last_name) }
end配置文件页面引用如上所述设置的@country_name。国家/地区名称将按预期显示在屏幕上。
我在想,我需要以某种方式向Rspec2测试添加一些东西。我不知道在哪里做这件事。因为@country_name是一个与用户无关的实例变量,所以我觉得我可能需要直接在我的Rspec2文件中做一些事情。
任何帮助都将不胜感激。到目前为止,我还没有找到这样的东西,但我会继续寻找。
更新:2012-06-8 7:27 pm CDT
这是我的用户控制器逻辑。在这里添加第二行会产生RSpec2错误。我在RSpec2测试中没有做任何更改。show.html.erb中引用了@country_name。
def show
@user = User.find(params[:id])
@country_name = Country.find(@user.country_id).name
end我决定尝试这样做,但得到了相同的错误:
describe "profile page" do
let(:user) { FactoryGirl.create(:user) }
let(:country) { FactoryGirl.create(:country) }
before { visit user_path(user) }
it { should have_selector('span', text: user.first_name+' '+user.last_name) }
it { should have_selector('title', text: user.first_name+' '+user.last_name) }
end我在factories.rb中独立于用户工厂添加了以下内容。
factory :country do
id 1
name "CountryName"
iso "CN"
end同样,我的国家/地区名称的应用程序逻辑工作得很好。
更新时间:2012-06-11 9:09
这是我的factories.db文件。country_id在User中的默认值为1。我尝试使用如下定义的country_id,并且没有对country_id进行声明。我也有一个没有身份证的乡村工厂。我仍然得到了描述的错误。在这里提交我的问题之前,我已经尝试过了。
FactoryGirl.define do
factory :user do
sequence(:first_name) { |n| "First Name #{n}" }
sequence(:last_name) { |n| "Last Name #{n}" }
sequence(:username) { |n| "Username#{n}" }
sequence(:email) { |n| "person_#{n}@example.com" }
password "foobar"
password_confirmation "foobar"
sequence(:city) { |n| "City #{n}" }
sequence(:state_province) { |n| "State/Province #{n}" }
active_user "1"
country_id 1
factory :admin do
admin true
active_user "3"
end
factory :blocked do
active_user "1"
end
factory :rejected do
active_user "2"
end
factory :not_visible do
active_user "3"
visible false
end
factory :visible do
active_user "3"
visible true
end
end
factory :country do
id 1
name "CountryName"
iso "CN"
end
end更新:2012-06-11 5:37 pm CDT
经过几个小时的继续搜索和完全重启我的计算机(叹气),我终于能够让测试工作。我在用户工厂中用user.association :country替换了country。我把我原来的两个语句放在describe "profile page“do语句后面。有了建议的更改,我现在就没有错误了。我猜关联将在Country中创建相应的行。
非常感谢你的帮助。解决了这一问题的是所收到的帮助与一项修改的组合。
弄清楚如何检查更改的值.......
更新时间:2012-06-12 10:55
看起来在所有的代码更正之后,我可以毫无错误地使用@user.country.name了。我将更改我的代码以使用这种流线型编码。
发布于 2012-06-09 08:49:20
如果你使用的是数据库清理器或类似的东西,那么在每次测试运行时,这些变量可能会在数据库中被销毁。您应该在之前的代码块中设置您的工厂:
编辑:我刚刚意识到这可能是因为您试图通过显式输入I来匹配记录。这不会起作用(ids是由数据库自动设置的),但是Factory Girl应该处理你的关联,看看当你像这样设置之前的代码块时会发生什么:
before(:each) do
country = FactoryGirl.create(:country)
user = FactoryGirl.create(:user, country: country)
visit user_path(user)
end我还会删除
id 1来自您的国家/地区工厂的行,以及将用户工厂上的country_id设置为1的行。
编辑2:你需要告诉Factory Girl你的关联,不要试图通过明确地设置id字段来设置它们,因为这不会起作用。
删除
country_id 1从用户工厂
id 1从country工厂,并将以下行添加到用户工厂:
country(是的,就是它自己的国家-工厂女孩足够聪明,只要工厂和协会的名称相同,就能弄清楚发生了什么。)
顺便说一句,您可以更改以下内容:
@country_name = Country.find(@user.country_id).name至
@country_name = @user.country.name它在这里不会有帮助,但它更干净。
https://stackoverflow.com/questions/10956919
复制相似问题