无法区分 Rspec 的“let”与“let!”

2023-12-25

我已阅读rspec 文档 https://www.relishapp.com/rspec/rspec-core/docs/helper-methods/let-and-let并搜索了许多其他地方,但我很难理解 Rspec 之间的区别let and let!

我读过let直到需要时才会初始化,并且它的值仅根据示例进行缓存。我也读过let!强制变量立即存在,并强制调用每个示例。我想因为我是新手,所以我很难理解这与以下示例有何关系。为什么:m1需要设置let!断言m1.content存在于页面上,但是:user可以设置为let断言该页面包含text: user.name?

  subject { page }

  describe "profile page" do
    let(:user) { FactoryGirl.create(:user) }
    let!(:m1) { FactoryGirl.create(:micropost, user: user, content: "Foo") }
    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 "microposts" do
      it { should have_content(m1.content) }
      it { should have_content(m2.content) }
      it { should have_content(user.microposts.count) }
    end
  end

  describe "after saving the user" do
    before { click_button submit }
    let(:user) { User.find_by_email('[email protected] /cdn-cgi/l/email-protection') }

    it { should have_selector('title', text: user.name) }
    it { should have_success_message('Welcome') } 
    it { should have_link('Sign out') }
  end

因为 before 块正在调用visit user_path(user)用户值在那里初始化,RSpec 将访问该页面。如果:m1 :m2没有使用let!那么访问不会产生任何内容

it { should have_content(m1.content) }
it { should have_content(m2.content) }

失败,因为它期望在用户访问该页面之前创建微帖子。let!允许在调用 before 块之前创建微帖子,并且当测试访问该页面时,微帖子应该已经创建。

编写相同测试并让它们通过的另一种方法是执行以下操作:

describe "profile page" do
  let(:user) { FactoryGirl.create(:user) }
  let(:m1) { FactoryGirl.create(:micropost, user: user, content: "Foo") }
  let(:m2) { FactoryGirl.create(:micropost, user: user, content: "Bar") }

  before do
    m1
    m2
    visit user_path(user)
  end

调用变量m1 and m2 before visit user_path(user)导致它们在访问页面之前被初始化并导致测试通过。

UPDATE这个小例子会更有意义:

在此示例中,我们调用 get_all_posts ,它仅返回帖子数组。请注意,我们在断言之前和之前调用该方法it块被执行。因为在执行断言之前不会调用 post 。

def get_all_posts
  Post.all
end

let(:post) { create(:post) }

before { @response = get_all_posts }

it 'gets all posts' do 
  @response.should include(post)
end

通过使用let!一旦 RSpec 看到该方法(在before块)并且该帖子将返回到列表中Post

同样,另一种方法是在调用该方法之前在 before 块中调用变量名称

before do
  post
  @response = get_all_posts
end

因为这将确保let(:post)在调用方法本身之前调用块创建Post以便它返回Post.all call

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法区分 Rspec 的“let”与“let!” 的相关文章

随机推荐

  • javascript - Express.js 中的 app.set('port', 8080) 与 app.listen(8080)

    我一直在尝试使用 Express js 来启动一个网站 起初 我使用的是app set port 8080 但浏览器无法连接到该页面 后来我把代码改成了app listen 8080 并且网页正常显示 这让我想知道 这两个函数有什么区别 a
  • R Shiny - 使用 updateSelectizeInput 优化页面加载时间

    我们的闪亮页面有多个selectizeInput控件 其中一些在下拉框中有很长的列表 因此 初始加载时间很长 因为需要预先填充所有下拉框selectizeInput控制 编辑 请参阅下面的示例 显示加载长列表如何影响页面加载时间 请复制以下
  • 图中的颜色点根据值向量的不同而不同

    我正在使用 R 绘制下图plot 功能 这是一个向量图shiftTime的时间转变 我有另一个向量intensity强度值范围从 3到 9 我想根据具有颜色渐变的这些值对图中的点进行着色 在示例中 我可以在实际绘制点的值上找到颜色 因此在本
  • 如何让 Knockout.js 设置属性的命名空间 URI?

    在 svg 中 如果我使用淘汰赛来设置xlink href属性为a节点 属性的命名空间设置不正确 因此a单击时不能用作链接 例如 请考虑以下包含两个链接的椭圆的 svg 有其一xlink href属性是硬编码的 另一个是通过淘汰赛设置的da
  • 在discord.py中我该如何制作才能使机器人仅在一台服务器上工作

    在discord py 中 我该如何让机器人只在一个上运行 有没有办法做到这一点 x channel id if x 12454431344645423 this is the channel id print hi 最简单的方法是不将其添
  • 如何确定 cv::Mat 是否为零矩阵?

    我有一个根据以下代码动态更改的矩阵 for It all frames begin It all frames end It ItTemp It subtract ItTemp Base NewData cout lt lt The siz
  • Android ArrayAdapter 和 JSONArray

    我是 Android 开发新手 考虑到 JSON Carrier 相对于 XML 的轻便性 我纯粹喜欢在我的简单应用程序中使用 JSON 对象和数组 我在使用 ArrayAdapter 填充 ListView 时遇到了挑战 这就是我克服的方
  • 对于 Scala 来说,类型擦除有什么优点吗?

    我听说过很多关于不同 JVM 语言的信息 这些语言仍处于蒸气软件模式 建议以某种方式实现具体化 我有一个半记得的 或者完全想象的 不知道是哪一个 的想法 我在某处读到 Scala 以某种方式利用 JVM 的类型擦除来完成具体化无法完成的事情
  • Android Wear 5.1 手腕手势 API?

    适用于可穿戴设备的 Android 5 1 1 引入了通过旋转 轻拂手腕来关闭通知的功能 这个API是否暴露给开发者使用 我无法找到任何相关信息 并且他们的可穿戴设备开发人员网站似乎没有更新 不 目前没有适用于 Wear 1 0 设备的手腕
  • 如何在Silverlight Image控件上显示TIFF(以Byte[]的形式)

    我创建了一个窗口服务 将所有 TIFF 文件放入数据库并将它们存储为Byte 现在我希望能够通过Silverlight Image控件来显示它们 所以我在绑定 XAML 期间使用转换器来转换Byte to Bitmap因为Image Sou
  • Delphi - 从类和接口继承(适配器模式)?

    我正在尝试执行 GoF 适配器模式 在 C 示例中 我遵循的 Adapter 类继承了原始类和一个适配接口 据我所知 在Delphi 2007 中 这是不可能的 或者是吗 因为如果一个类继承一个接口 它需要从 TInterfacedObje
  • Strawberry Perl v5.30.0 无法安装 Tcl (Windows 10)

    我从下载并安装了草莓 perl 5 30 0 1 64bit msi草莓perl com http strawberryperl com 在我的 Windows 10 上并尝试使用 cpan 安装 Tcl 模块 但由于缺少 tclsh 而失
  • 通过预定义的静态地址访问寄存器在 C++ 中是未定义的行为吗?

    我正在编译一个 C 程序以在独立环境中运行 并且我正在运行的 CPU 定义了一个可用的 32 位外设寄存器 编辑 内存映射 at PERIPH ADDRESS 正确对齐 并且不与任何其他 C 对象 堆栈等重叠 我编译以下代码PERIPH A
  • cmake、add_custom_command 以及来自不同目录的依赖项

    我有一个关于 CMake 的问题 这似乎是这里常见的问题 但没有一个答案似乎能解决我的问题 In the details子目录下有一个CMakeLists txt其中包含 add custom command OUTPUT part out
  • gforth 出错,libtool 编译失败

    我正在尝试跑步gforth与Rosetta 代码上的 Echo 服务器 https rosettacode org wiki Echo server 但是我得到以下信息 sh 1 libtool not found in file incl
  • 从 GridView 发起的 ContextMenu

    只是想知道是否有人可以帮助解决这个问题 我正在学习但无法弄清楚 如果我使用上下文菜单注册 GridView 对象 如下所示 registerForContextMenu gridview 如何确定菜单是从网格中的哪个视图对象 方块启动的 任
  • iOS:使用 iPad 键盘的 Enter 键进行操作

    我有两个文本字段 在第一个文本字段中我写 Hello 当我在 iPad 键盘中按 Enter 时 我希望在第二个文本字段中出现 World 如何使用 Enter 在我的应用程序中创建操作 您通常会将视图控制器指定为文本字段的委托 然后实现t
  • spring-boot 在单个 Web 应用程序路径上设置基本身份验证?

    我正在尝试在基于 spring boot spring MVC 的应用程序中设置单个路径 basic 以进行基本身份验证保护 我将使用我自己的自定义配置参数进行配置 因此用户名和密码只是 admin 和 admin 目前这适用于 basic
  • 如何微调Spring Cloud Feign客户端?

    春天的云doc http projects spring io spring cloud spring cloud html says 如果 Hystrix 在类路径上 默认情况下 Feign 将包装所有方法 带断路器 这很好 但是如何配置
  • 无法区分 Rspec 的“let”与“let!”

    我已阅读rspec 文档 https www relishapp com rspec rspec core docs helper methods let and let并搜索了许多其他地方 但我很难理解 Rspec 之间的区别let an