2

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とテストに合格PropertyBColumnAた場合で、間違いを指摘しないことです。

オプション 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 をテストするためのはるかに優れた、より簡単な方法があります。提案していただけますか?

4

1 に答える 1

0

CheckReference提案には次を使用する必要があります。

.CheckReference(
        c => c.Proposal,
        new Proposal
            {
                IsDeleted = false,
                TenantId = 1,
                VersionNumber = 1,
                OutletId = 1,
                StatusId = "TST"
        })
于 2012-11-22T16:52:44.610 に答える