嗨,我是 rspec 的新手,并試圖弄清楚將塊傳遞給 expect{} 和僅使用 expect() 之間有什么區別
這是一個簡單的例子
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
這運行良好,但是當我這樣做時
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
它拋出一個錯誤
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)>
即使我不使用帶有更改的塊,它也會給我一個錯誤
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
失敗:
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.
有人可以解釋為什么會這樣嗎?
uj5u.com熱心網友回復:
該expect(...)語法用于期望括號中陳述句的回傳值與某個條件匹配,例如:
expect(result).to eq(3)
expect(list).not_to be_empty
expect(string).to match(/regexp/)
expect(1..10).to cover(3)
運行塊并且并不真正關心塊的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
在 RSpec 檔案中查找更多示例
在你的例子中
expect { array << 1 }.to change { array.count }.by(1)
因為將值推入陣列的副作用是陣列中元素的數量發生了變化。但
expect(array << 1).to change { arr.count }.by(1)
不起作用,因為 is 的回傳值和這種語法不支持匹配器。expect(array << 1)[1, 2, 3, 1]change
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/503812.html
下一篇:迭代時如何存盤結果?
