gpt4 book ai didi

ruby-on-rails - config.cache_classes = false 弄乱了 rspec 测试?

转载 作者:行者123 更新时间:2023-12-01 02:50:25 25 4
gpt4 key购买 nike

我正在关注 Michael Hartl (railstutorial.org) 的 Ruby on Rails 教程。

在某些时候,我厌倦了测试失败只是因为测试使用了旧的缓存版本的类,所以我在测试环境中关闭了 config.cache_classes。这解决了问题,一段时间内一切顺利。

直到我尝试实现第 8.4.3 章中的集成测试。此时将数据输入到数据库中

it "should make a new user" do
lambda do
visit signup_path
fill_in "Name", :with => "Example User"
fill_in "Email", :with => "user@example.com"
fill_in "Password", :with => "foobar"
fill_in "Confirmation", :with => "foobar"
click_button
response.should have_selector("div.flash.success",
:content => "Welcome")
response.should render_template('users/show')
end.should change(User, :count).by(1)
end

每次测试后都会保留在数据库中,所以只有第一次运行这个测试时它才会工作,之后它总是失败,直到我手动清空数据库。
除此之外,它起作用了。
但是现在在第 9 章中,集成测试再次失败:
describe "when signed in" do

before(:each) do
@user = Factory(:user)
visit signin_path
fill_in :email, :with => @user.email
fill_in :password, :with => @user.password
click_button
end

it "should have a signout link" do
visit root_path
response.should have_selector("a", :href => signout_path,
:content => "Sign out")
end

这一次它不起作用,用户没有登录,结果页面没有退出链接,只有正常的登录链接。
在网络浏览器中测试时,它工作正常。

我花了数小时和数天在互联网上搜索并测试不同的东西,最后我找到了解决方案:重新打开 config.cache_classes。
现在它完美无缺。

那么谁能向我解释为什么 config.cache_classes 使测试失败?我怎样才能在不弄乱我的测试的情况下关闭缓存?

提前致谢,

最好的问候,托比亚斯

最佳答案

当您进行 Capybara 调用时,它会使用 rack-test 来模拟对 rails 应用程序的调用。每次调用完成时,它都会重新加载所有 rails 类。这意味着您在调用 'visit signin_path' 之前创建的 @user 对象将被清除,因为所有 ActiveRecord 对象都已重新加载。

当您将 cache-classes 设置为 true 时,它​​会告诉 Rack 不要在每次请求时重新加载 ActiveRecord 对象,因此您的测试会再次通过。

我相信,如果您希望在不打开缓存类的情况下通过上面编写的测试,您应该将 '@user = Factory(:user)' 行移到 'visit signin_path' 行下方。

关于ruby-on-rails - config.cache_classes = false 弄乱了 rspec 测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5272978/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com