看隔壁於 ORM 的 Ruby/Rails 的都被其他言走了,但我得至少 RSpec 在 JS 世界有替代。以下是一用 RSpec 的例子:
require 'rspec' require 'matrix' RSpec.describe 'numbers' do # 描述加法的性 shared_examples 'addition' do # 加法足交律 # a 和 b 在的 context 注入 it 'has commutativity' do expect(a + b).to eq(b + a) end end context 'for number' do # 令 a 和 b ,用加法的用例 let(:a) { Random.rand } let(:b) { Random.rand } it_behaves_like 'addition' end context 'for vector' do # a 和 b 可以是向量,也足加法的性 let(:a) { Vector[Random.rand, Random.rand] } let(:b) { Vector[Random.rand, Random.rand] } it_behaves_like 'addition' end end 如果要用 js ,至少所有的 a 和 b 都要成似context.a context.b,因 ruby 有 self ,而 js 只有法作用域,致 js 的 dsl 表力很受限。
另外在 ruby 也可以很易做 mock ,例如例子修改了Date.today返回我用的日期:
require 'rspec' require 'date' RSpec.describe 'Date' do # 定一用的日期,一般使用的 let(:date) { Date.parse('1970-01-01') } before do # Date.today 本身是定好的,但我可以覆它返回我的日期 allow(Date).to receive(:today).and_return(date) end describe '.today' do it 'is the mocked date' do # Date.today 在是我 mock 的日期 1970-01-01 expect(Date.today).to eq(date) end end end 