Jas*_*ngh 2 ruby testing rspec ruby-on-rails
Hi I am new to rspec and was trying to figure out what is the difference between passing a block to expect{ } and just using expect( )
Here is a trivial example
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
Run Code Online (Sandbox Code Playgroud)
This runs fine but when I do this instead
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
Run Code Online (Sandbox Code Playgroud)
It throws an error
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)>
Run Code Online (Sandbox Code Playgroud)
And even when I don't use a block with change it gives me an error
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
Run Code Online (Sandbox Code Playgroud)
Failures:
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.
Run Code Online (Sandbox Code Playgroud)
Can someone explain why is it happening??
该expect(...)语法用于期望括号中的语句的返回值与特定条件匹配,例如:
expect(result).to eq(3)
expect(list).not_to be_empty
expect(string).to match(/regexp/)
expect(1..10).to cover(3)
Run Code Online (Sandbox Code Playgroud)
运行expect { ... }块并不真正关心块的返回值,而是关心运行块中代码的副作用。就像通过运行块或引发异常来更改另一个值一样。
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
Run Code Online (Sandbox Code Playgroud)
在 RSpec 文档中查找更多示例
在你的例子中
expect { array << 1 }.to change { array.count }.by(1)
Run Code Online (Sandbox Code Playgroud)
因为将值推入数组的副作用是数组中元素的数量发生变化。但
expect(array << 1).to change { arr.count }.by(1)
Run Code Online (Sandbox Code Playgroud)
不起作用,因为返回值是expect(array << 1)并且[1, 2, 3, 1]此语法不支持change匹配器。