首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rspec expect( ) vs expect {}

Rspec expect( ) vs expect {}
EN

Stack Overflow用户
提问于 2022-09-03 08:36:06
回答 1查看 146关注 0票数 2

嗨,我是rspec的新手,我想弄清楚把块传递给expect{ }和只使用expect( )有什么区别?

下面是一个简单的例子

代码语言:javascript
复制
require "rails_helper"
RSpec.describe "Test",type: :model do
 it "testing count" do
   arr=[1,2,3]
   expect{arr<<1}.to change{arr.count}.by(1)
 end
end

这很好,但是当我这样做的时候

代码语言:javascript
复制
    require "rails_helper"
    RSpec.describe "Test",type: :model do
      it "testing count" do
        arr=[1,2,3]
        expect(arr<<1).to change{arr.count}.by(1)
      end
    end

它会抛出一个错误

代码语言:javascript
复制
Failures:

  1) Test testing count
     Failure/Error: expect(arr<<1).to change{arr.count}.by(1)
       expected `arr.count` to have changed by 1, but was not given a block
     # ./spec/models/test_spec.rb:6:in block (2 levels) in <top (required)>

即使我不使用块进行修改,它也会给我一个错误

代码语言:javascript
复制
require "rails_helper"
RSpec.describe "Test",type: :model do
  it "testing count" do
    arr=[1,2,3]
    expect{arr<<1}.to change(arr.count).by(1)
  end
end

失败:

代码语言:javascript
复制
  1) Test testing count
     Failure/Error: expect{arr<<1}.to change(arr.count).by(1)
     
     ArgumentError:
       `change` requires either an object and message (`change(obj, :msg)`) or a block (`change { }`). You passed an object but no message.

有人能解释一下为什么会这样吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-03 08:56:34

expect(...)语法用于期望括号中语句的返回值与特定条件相匹配,例如:

代码语言:javascript
复制
expect(result).to eq(3)
expect(list).not_to be_empty
expect(string).to match(/regexp/)
expect(1..10).to cover(3)

expect { ... }运行该块,并不真正关心块的返回值,而是关注在块中运行代码的副作用。与此类似,另一个值通过运行块或引发异常而发生更改。

代码语言:javascript
复制
expect { api_request }.to raise_error(NotFoundError)
expect { object.action }.to change(object, :value).from(old).to(new)
expect { actual }.to output("some output").to_stdout

找到更多的RSpec文档中的示例

在你的例子中

代码语言:javascript
复制
expect { array << 1 }.to change { array.count }.by(1)

因为将值推入数组的副作用是数组中元素的计数发生了变化。但

代码语言:javascript
复制
expect(array << 1).to change { arr.count }.by(1)

不工作,因为expect(array << 1)的返回值是[1, 2, 3, 1],并且这个语法不支持change匹配器。

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

https://stackoverflow.com/questions/73590798

复制
相关文章

相似问题

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