0

ある単体テストが別の単体テストに依存するようになり、NHiberante セッションのオブジェクトが原因で失敗すると、奇妙な動作が発生します。

フィクスチャからすべての単体テストを実行した場合にのみ、「NHibernate.PropertyValueException : not-null プロパティが null または一時的なものを参照しています」というメッセージが表示されます (簡単にするために、テストは 2 つしかありません)。それらの1つを実行すると、常に合格しました。

大掃除をしたほうがいいと思います。session.Clean() と session.Evict(obj) を試しましたが、役に立ちませんでした。誰かがここで何が起こっているのか説明できますか?

実在物:

public class Order
{
    public virtual Guid Id { get; protected set; }
    public virtual string Name { get; set; }
}

マッピング (Loquacious API を使用):

public class OrderMapping : ClassMapping<Order>
{
    public OrderMapping()
    {
        Id(e => e.Id, m =>
            {
                m.Generator(Generators.Guid);
                m.Column("OrderId");
            });
        Property(e => e.Name, m => m.NotNullable(true));
    }
}

Fixture ctor (メモリ内データベースが使用されます):

var config = new Configuration();
config.CurrentSessionContext<ThreadStaticSessionContext>();
config.DataBaseIntegration(db =>
    {
        db.ConnectionString = "uri=file://:memory:,Version=3";
        db.Dialect<SQLiteDialect>();
        db.Driver<CsharpSqliteDriver>();
        db.ConnectionReleaseMode = ConnectionReleaseMode.OnClose;
        db.KeywordsAutoImport = Hbm2DDLKeyWords.AutoQuote;
        db.LogSqlInConsole = true;
    })
    .SessionFactory()
    .GenerateStatistics();

var mapper = new ModelMapper();
mapper.AddMappings(Assembly.GetExecutingAssembly().GetExportedTypes());
config.AddMapping(mapper.CompileMappingForAllExplicitlyAddedEntities());

ISessionFactory sessionFactory = config.BuildSessionFactory();
this.session = sessionFactory.OpenSession();

// This will leave the connection open
new SchemaExport(config).Execute(
    true, true, false, this.session.Connection, null);
CurrentSessionContext.Bind(this.session);

単体テスト:

[Test]
[ExpectedException(typeof(PropertyValueException))]
public void Order_name_is_required()
{
    var order = new Order();
    this.session.Save(order);
}

[Test]
public void Order_was_updated()
{
    var order = new Order { Name = "Name 1" };
    this.session.Save(order);

    this.session.Flush();

    order.Name = "Name 2";
    this.session.Update(order);

    Assert.AreEqual(this.session.Get<Order>(order.Id).Name, "Name 2");
}

注文が更新され、「NHibernate.PropertyValueException : not-null プロパティが null または一時的なものを参照しています」という例外で失敗します。実際には、後に書き込むと、他の単体テストは失敗します。

EDIT 1 解決策が見つかりました。前回使用したセッションをクリーンアップしようとしたとき

[TestFixtureTearDown]

それ以外の

[TearDown]
public void TearDown()
{
    this.session.Clear();
}

テストの実行前にすべて適切にクリーンアップし、同じセッションを使用してメモリ内データベース構造を再作成しませんでした。すみません、明らかな間違いを犯しました。

4

1 に答える 1