NHibernate マッピングを検証するときに同じテスト パターンを複製するのにうんざりしたので、CRUD テスト クラスに取り組んでいます。
私はコードをリファクタリングし、すべてが思い描いた通りに機能するところまで来ました。すべては、適切なリポジトリ メソッドを呼び出し、エンティティ ID などの対応するプロパティの値を取得するためにリフレクション メソッドによって使用される文字列に基づいています。
これは機能しますが、そのようなことに文字列を使用するという悪に入る必要はないと確信しています。
それで、Linq を使い始めました。私はLinqのヘビーユーザーではありませんが、次のコードには完全に困惑しています。
それはほぼ完璧に動作し (ほぼ 1 秒で表示されます)、動作することを非常に嬉しく思いますが、その理由を知りたいと思っています。
[Test]
public void TestCanUseTesterWithLinqSecondEffort()
{
IRepositoryTestContextManager contextManager = new NHRepositoryTestContextManager();
contextManager.SetUpRepositoryContextAndSchema();
TestInsertMethodWithLinq<NHClientRepository, Client>((x, y) => x.InsertClient(y), _newClient);
contextManager.ResetRepositoryContext();
Client retrievedClient = TestRetrieveMethodWithLinq<NHClientRepository, Client, string>((clientRepository, publicId) => clientRepository.GetClient(publicId), client => client.PublicId, _newClient);
contextManager.TearDownRepositoryContext();
Assert.IsNotNull(retrievedClient);
Assert.AreNotSame(_newClient, retrievedClient);
Assert.AreEqual(_newClient.Id, retrievedClient.Id);
Assert.AreEqual(_newClient.PublicId, retrievedClient.PublicId);
Assert.AreEqual(_newClient.Name, retrievedClient.Name);
}
private void TestInsertMethodWithLinq<TRepositoryType, TEntityType>(Action<TRepositoryType, TEntityType> insertMethod, TEntityType entity)
where TRepositoryType : class, new()
{
insertMethod.Invoke(new TRepositoryType(), entity);
}
private TEntityType TestRetrieveMethodWithLinq<TRepositoryType, TEntityType, TArgumentType>(Func<TRepositoryType, TArgumentType, TEntityType> retrieveMethod, Func<TEntityType, TArgumentType> paramValue, TEntityType theEntity)
where TRepositoryType : class, new()
{
return retrieveMethod.Invoke(new TRepositoryType(), paramValue(theEntity));
}
具体的には、呼び出された 2 つのデリゲートについて話しています (デリゲートを使用するために、invoke を呼び出す必要がないことはわかっています。明確にするために含めました)。新しくインスタンス化されたクラス (この場合は TRepositoryTypes) で正しいメソッドが呼び出されるように、コンパイラは Linq 式をどのように変換するのでしょうか?
「ほぼ完全」については、呼び出されたメソッドの処理中に例外が発生した場合、その例外は飲み込まれます。それがなぜなのかはわかりませんが、例外が飲み込まれたためにテストが完了せず、問題が見逃されるシナリオをすでに確認できます。
それを噛んでください。前もって感謝します。