NHibernate Mapping クラスをテストする最良の方法は何ですか?
次のマップをテストしたいとします。
public QuoteMap()
{
this.Table("QUOTE");
this.Id(x => x.Id).Column("QUOTE_ID").GeneratedBy.Sequence("SEQ_QUOTE_ID");
this.Map(x => x.IsDeleted).Column("IS_DELETED");
this.References(x => x.Proposal).Column("PROPOSAL_ID");
}
type は別のテーブルにProposal
マップされます。
QUOTE テーブルは次のようになります。
CREATE TABLE "QUOTE"
(
"QUOTE_ID" NUMBER(18,0) NOT NULL,
"PROPOSAL_ID" NUMBER(18,0) NOT NULL ENABLE,
"IS_DELETED" NUMBER(1,0) DEFAULT 0 NOT NULL ENABLE,
CONSTRAINT "PK_QUOTE" PRIMARY KEY ("QUOTE_ID"),
CONSTRAINT "FK_QUOTE_PROPOSAL" FOREIGN KEY ("PROPOSAL_ID") REFERENCES
"PROPOSAL" ("PROPOSAL_ID") ENABLE
)
オプション 1: PersistenceSpecification
new PersistenceSpecification<Quote>(session, new CustomEqualityComparer())
.CheckProperty(c => c.TenantId, 1)
.CheckProperty(c => c.IsDeleted, false)
.CheckReference(
c => c.Proposal,
new Proposal
{
Id = 1,
IsDeleted = false,
TenantId = 1,
VersionNumber = 1,
OutletId = 1,
StatusId = "TST"
})
.VerifyTheMappings();
transaction.Commit();
...このテストは、次の例外で失敗します。
NHibernate.Exceptions.GenericADOException: 挿入できませんでした: [Quote#18][SQL: INSERT INTO QUOTE (IS_DELETED, PROPOSAL_ID, QUOTE_ID) VALUES (?, ?, ?)] ---> Oracle.DataAccess.Client.OracleException: ORA -02291: 整合性制約 (PROPOSALOWN.FK_QUOTE_PROPOSAL) に違反しています - 親キーが見つかりません
...そこにあるPROPOSALレコードに依存しているためId = 1
です。これに関するもう 1 つの問題は、偶然にマップPropertyA
した場合ColumnB
とテストに合格PropertyB
しColumnA
た場合で、間違いを指摘しないことです。
オプション 2: 生の SQL から INSERT、NHibernate から SELECT これが理想的です: 生の SQL ステートメントを発行して挿入します。
INSERT INTO QUOTE (QUOTE_ID, PROPOSAL_ID, IS_DELETED)
SELECT SEQ_QUOTE_ID.NextVal, 1, 0 from dual;
次に、Nhibernate を使用して読み取り、値を確認します。問題は、そこにある PROPOSAL レコードへの依存です。このテストの PROPOSAL レコードを挿入しますか? もちろん!ただし、Proposal テーブルには別の FOREIGN KEYS のセットがあるため、マッピングをテストするためだけに何十ものテーブルに ROWS を挿入することになる可能性があります。
確かに、NHibernate Maps をテストするためのはるかに優れた、より簡単な方法があります。提案していただけますか?