Skip to main content
 首页 » 编程设计

c#之测试 NHibernate map

2024年01月01日39itcoder

测试 NHibernate 映射类的最佳方法是什么?

假设我要测试以下 map :

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"); 
} 

其中 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: could not insert: [Quote#18][SQL: INSERT INTO QUOTE (IS_DELETED, PROPOSAL_ID, QUOTE_ID) VALUES (?, ?, ?)] ---> Oracle.DataAccess.Client.OracleException: ORA-02291: integrity constraint (PROPOSALOWN.FK_QUOTE_PROPOSAL) violated - parent key not found

...因为它依赖于 Id = 1 的 PROPOSAL 记录。 另一个问题是,如果您巧合地将 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。你能推荐一个吗?

请您参考如下方法:

您应该为提案使用 CheckReference:

.CheckReference( 
        c => c.Proposal, 
        new Proposal 
            { 
                IsDeleted = false, 
                TenantId = 1, 
                VersionNumber = 1, 
                OutletId = 1, 
                StatusId = "TST" 
        })