rspec のマッチャ拡張
have_out_of_range_validationhave_association_db_indexhave_executable_sql
「sql レベルで out of range を起こす値をバリデーションエラーにすること」
describe Model do
it{expect(Model).to have_out_of_range_validation}
it{expect(Model).to have_out_of_range_validation.except(:my_column,:my_column2)}
it{expect(Model).to have_out_of_range_validation.force(:my_column,:my_column2)}
it{expect(Model).to have_out_of_range_validation.as(
my_column: 10**10
)}
end全カラムはモデルの columns メソッドを使用して取得する
保存できる最大長は column オブジェクトから取得する
- except で除外するカラムを列挙できる
- force で除外するカラムに該当する場合でもチェックできる
- as で例外を引き起こすべき値をカラムごとに指定できる
Ans::Matchers.configure do |config|
config.have_out_of_range_validation.except_columns = [
:id,
%r{_id$},
%r{_type$},
%r{_status$},
%r{_fla?g$},
]
end- except_columns にデフォルトで無視するカラムを列挙する
「association のアクセスで使用されるカラムの index を持つこと」
describe Model do
it{expect(Model).to have_association_db_index}
it{expect(Model).to have_association_db_index.except(:my_column,:my_column2)}
end全カラムはモデルの columns メソッドを使用して取得する
*_id という名前のカラムに対して index がはられているか確認する
- except で除外するカラムを列挙できる
Ans::Matchers.configure do |config|
config.have_association_db_index.validate_columns = [
%r{_id$},
]
end- validate_columns にチェックするカラムを列挙する
「スコープは実行可能な sql を生成すること」
describe Model do
it{expect(Model.my_scope("arg1","arg2")).to have_executable_sql <<-SQL}
SELECT `table`.* from `table`
WHERE `table`.`id` in ("arg1", "arg2")
SQL
end- 指定されたスコープの
to_sqlが一致すること - そのスコープを
eachした時にエラーにならないこと
空白の違いは無視して比較される
これは削除予定ですので使用しないように
「実行可能なスコープが存在すること」
describe Model do
subject{Model}
it{should have_executable_scope(:scope).to_sql(<<SQL)}
SELECT
`table`.*
FROM
`table`
WHERE
`table`.`column` = 'value'
SQL
end
to_sql で指定した文字列と scope.to_sql で返った文字列を比較する
sql は空白をまとめて比較される
空白も含めて完全一致で比較する場合は strict! メソッドを使用する
describe Model do
subject{Model}
it{should have_executable_scope(:scope).strict!.to_sql("".tap{|sql|
sql << "SELECT `table`.* FROM `table` "
sql << " WHERE `table`.`column` = 'value'"
})}
end
スコープにパラメータを渡す場合は params メソッドを使用する
describe Model do
subject{Model}
it{should have_executable_scope(:scope).params("a","b","c").to_sql(<<SQL)}
SELECT
`table`.*
FROM
`table`
WHERE
`table`.`column` = 'a'
AND
`table`.`column` = 'b'
AND
`table`.`column` = 'c'
SQL
end
これは削除予定ですので使用しないように
「保存に成功すること」
describe Model do
it{should_not success_persistance_of(:name).values(["a"*256])}
end
データベースに保存できないデータを指定して、 should_not でマッチさせることを想定している
values メソッドで、値を配列で指定する
例)
describe Model do
it{should_not success_persistance_of(:name).values([nil])} # not null カラム
it{should_not success_persistance_of(:name).values(["a", "a"])} # unique カラム
it{should_not success_persistance_of(:name).values(["a"*256])} # varchar(255)
it{should_not success_persistance_of(:name).values([10**10])} # int(9)
end
他のカラムはすべて nil で保存される
他のカラムにデフォルトを与える場合は subject 句を定義する
例)
describe Model do
subject{Model.new FactoryGirl.attributes_for(:model)}
it{should_not success_persistance_of(:name).values([nil])} # not null カラム
it{should_not success_persistance_of(:name).values(["a", "a"])} # unique カラム
it{should_not success_persistance_of(:name).values(["a"*256])} # varchar(255)
it{should_not success_persistance_of(:name).values([10**10])} # int(9)
end