首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在工作的Rails代码中获取Rspec2错误

在工作的Rails代码中获取Rspec2错误
EN

Stack Overflow用户
提问于 2012-06-09 06:56:13
回答 1查看 166关注 0票数 0

我刚刚知道如何在模型用户上显示国家id号码中的国家名称。下面是我在一个控制器和两个视图中使用的基本代码,用于在根据用户的id找到用户后显示名称:

代码语言:javascript
复制
@country_name = Country.find(@user.country_id).name

我使用Factory Girl来模拟用户记录,其中对于美国,country_id的默认值是1。在我添加这个逻辑之前,我的Rspec2测试是干净的。现在,当我运行测试时,我得到了以下错误。在视图或控制器中具有类似逻辑的每个测试都会产生错误。

代码语言:javascript
复制
ActiveRecord::RecordNotFound:
   Couldn't find Country with id=1

下面是我正在做的两个Rspec2测试:

代码语言:javascript
复制
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。

代码语言:javascript
复制
def show
  @user = User.find(params[:id])
  @country_name = Country.find(@user.country_id).name
end

我决定尝试这样做,但得到了相同的错误:

代码语言:javascript
复制
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中独立于用户工厂添加了以下内容。

代码语言:javascript
复制
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进行声明。我也有一个没有身份证的乡村工厂。我仍然得到了描述的错误。在这里提交我的问题之前,我已经尝试过了。

代码语言:javascript
复制
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了。我将更改我的代码以使用这种流线型编码。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-09 08:49:20

如果你使用的是数据库清理器或类似的东西,那么在每次测试运行时,这些变量可能会在数据库中被销毁。您应该在之前的代码块中设置您的工厂:

编辑:我刚刚意识到这可能是因为您试图通过显式输入I来匹配记录。这不会起作用(ids是由数据库自动设置的),但是Factory Girl应该处理你的关联,看看当你像这样设置之前的代码块时会发生什么:

代码语言:javascript
复制
before(:each) do
    country = FactoryGirl.create(:country)
    user = FactoryGirl.create(:user, country: country)
    visit user_path(user)
end

我还会删除

代码语言:javascript
复制
id 1

来自您的国家/地区工厂的行,以及将用户工厂上的country_id设置为1的行。

编辑2:你需要告诉Factory Girl你的关联,不要试图通过明确地设置id字段来设置它们,因为这不会起作用。

删除

代码语言:javascript
复制
country_id 1

从用户工厂

代码语言:javascript
复制
id 1

从country工厂,并将以下行添加到用户工厂:

代码语言:javascript
复制
country

(是的,就是它自己的国家-工厂女孩足够聪明,只要工厂和协会的名称相同,就能弄清楚发生了什么。)

顺便说一句,您可以更改以下内容:

代码语言:javascript
复制
@country_name = Country.find(@user.country_id).name

代码语言:javascript
复制
@country_name = @user.country.name

它在这里不会有帮助,但它更干净。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10956919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档