Ruby Rspec测试文本是否为复数(Hartl 10.5练习1)

Ruby Rspec测试文本是否为复数(Hartl 10.5练习1),ruby,rspec,capybara,Ruby,Rspec,Capybara,Ruby 1.9.3,Rails 3.2.2 我正在尝试编写一个Rpsec(水豚)来测试我的页面是否正确地将单词“Post”复数化。我在运行Rspec时遇到一个错误,该错误说明: c:/…/my_app/spec/requests/user_pages_spec.rb:58:in'block(3层)in':未定义的局部变量或方法“user”。。。(名称错误) 以下是相关测试: describe "profile page" do let(:user){FactoryGirl.create

Ruby 1.9.3,Rails 3.2.2 我正在尝试编写一个Rpsec(水豚)来测试我的页面是否正确地将单词“Post”复数化。我在运行Rspec时遇到一个错误,该错误说明:

c:/…/my_app/spec/requests/user_pages_spec.rb:58:in'block(3层)in':未定义的局部变量或方法“user”。。。(名称错误)

以下是相关测试:

describe "profile page" do
    let(:user){FactoryGirl.create(:user)}
    let!(:m1){FactoryGirl.create(:micropost, user: user, content: "Food")}
    let!(:m2){FactoryGirl.create(:micropost, user: user, content: "Bar")}
    before {visit user_path(user)}
    it {should have_selector('h1', text: user.name)}
    it {should have_selector('title', text: user.name)}

    describe "pagination" do
        before(:all){40.times {FactoryGirl.create(:micropost, user: user, content: "Food")}}
        after(:all){User.delete_all}

        it {should have_selector('div.pagination')}
    end

    describe "microposts" do
        it {should have_content(m1.content)}
        it {should have_content(m2.content)}
        it {should have_content(user.microposts.count)}

        before do
            sign_in user
            visit root_path
            User.delete_all
        end

        it "should pluralize post numbers" do
            FactoryGirl.create(:micropost, user: user, content: "Food")
            page.should have_content("1 micropost")
            2.times {FactoryGirl.create(:micropost, user: user, content: "Food")}
            page.should have_content("2 microposts")
        end

我也不确定是否要用正确的方法测试帖子的多元化,但我主要感到困惑的是,为什么该块不能“看到”用户对象,因为我的if语句后面的行可以看到它。如果我注释掉if块,一切都会正常运行。

它之外的任何代码都无法访问前面用
定义的变量、
let
,等等。您需要将它放在
it
调用中,比如说,使用描述整个if/else测试的文本参数。您是否可以更新此问题以包含范围内的规范中的其他代码?

配置文件页面没有要测试的多重化。 测试应针对静态页面(主页)


更新。我不确定我是否理解你所说的
it
的范围。我将我的
it{should have_selector('Post)}
放在if/else中,这样做会使
it
调用失去关于my
let(:user)
定义的范围吗?不,将
it…
放在if/else中本身没有问题,问题是在
it
上下文之外引用
user
。具体地说,它是
if中对
user
的引用(user.microposts.count…
我假设它是文件中的第58行,即错误中报告的行号。通常,设置测试时不必使用这样的条件,但假设确实需要此逻辑,则需要在
if/else'的两个分支周围创建一个包含它的
it
,并删除
it`在每个分支上。啊,这是有道理的。我现在可以看出我的测试策略对于
if/else
块是错误的。我在上面更新了一种新的方法,感觉与您暗示的方向一致,但似乎我还没有完全获得rspec变量范围。将“microsoft”一词多元化的新测试没有通过,我把它缩小到一个事实,在我的
让!
开始时,我创建了两个帖子,它们保留在其余的块中。我试图删除它们(
User.delete\u all
这样做)但它们仍然存在,从而导致我的1 micropost测试失败。那么,你的问题得到回答了吗?你有新的问题吗?无论如何,你需要分享当前的信息(即规格、结果),以便我提供额外的帮助。已经回答了,你是对的,我现在有一个不同的问题。我将摸索(阅读:学习)更多关于这一点,然后发布一个新问题。谢谢,你的解释帮助我更好地理解了测试范围。
describe 'Home page' do
  describe 'for signed-in users' do
    let(:user) { FactoryGirl.create(:user) }
    before do
      FactoryGirl.create(:micropost, user: user, content: 'Lorem ipsum')
      FactoryGirl.create(:micropost, user: user, content: 'Dolor sit amet')
      sign_in user
      visit root_path
    end

    it { should have_content('micropost'.pluralize(user.microposts.count)) }
  end
end