私たちのチームのアプリケーション開発には、エンフォースフレームワークのDbContextを模擬するためのEffort Testing Toolの使用が含まれます。しかし、Effort Testing Toolは、Entity FrameworkのDbContextを模倣するためにアプリケーションが使用する実際のSQL Serverデータベースを確認する必要があり、Entity FrameworkのDbContextは適切なUnit Testing原則に反しているようです。
その理由は、データベース接続(例えば、Entity FrameworkのDbContext)に関連するものを嘲笑してアプリケーションコードを単体テストするために、データベースを起動して実行する必要はありません。
実際のSQL Serverデータベースを起動して実行しているEntity FrameworkのDbContextを模擬するためのEffort Testing Toolを構成するにはどうすればよいですか?
*アップデート:
@ gert-arnold私たちはバックエンドモデルとデータベースを実装するためにEntity Framework Model Firstアプローチを使用しています。
次の抜粋は、テストコードからのものです。
connection = Effort.EntityConnectionFactory.CreateTransient("name=NorthwindModel");
jsAudtMppngPrvdr = new BlahBlahAuditMappingProvider();
fctry = new BlahBlahDataContext(jsAudtMppngPrvdr, connection, false);
qryCtxt = new BlahBlahDataContext(connection, false);
audtCtxt = new BlahBlahAuditContext(connection, false);
mockedReptryCtxt = new BlahBlahDataContext(connection, false);
_repository = fctry.CreateRepository<Account>(mockedReptryCtxt, null);
_repositoryAccountRoleMaps = fctry.CreateRepository<AccountRoleMap>(null, _repository);
"name = NorthwindModel"は、edmxファイルに関連しています。このファイルには、データベーステーブルとそれに対応する関係に関する情報が含まれています。
次のコード行のように接続して "name = NorthwindModel"を削除すると、引数が必要であることを示すエラーが表示されます。
connection = Effort.EntityConnectionFactory.CreateTransient(); // throws error
上記のコードをどのように書き直すべきか説明してください。
EffortがEDMXファイルの場所を知る必要があるため、接続文字列のみが必要です。
EDMXファイルには、データベースと同じスキーマを持つメモリストアを作成するために必要なすべての情報が含まれています。ユーザーがEDMXパスを混乱させる必要がない場合に便利だと思ったので、接続文字列を指定する必要があります。
CreateTransientメソッドの実装をチェックすると、接続文字列を使用してそのメタデータ部分を取得するだけであることがわかります。
public static EntityConnection CreateTransient(string entityConnectionString, IDataLoader dataLoader)
{
var metadata = GetEffortCompatibleMetadataWorkspace(ref entityConnectionString);
var connection = DbConnectionFactory.CreateTransient(dataLoader);
return CreateEntityConnection(metadata, connection);
}
private static MetadataWorkspace GetEffortCompatibleMetadataWorkspace(ref string entityConnectionString)
{
entityConnectionString = GetFullEntityConnectionString(entityConnectionString);
var connectionStringBuilder = new EntityConnectionStringBuilder(entityConnectionString);
return MetadataWorkspaceStore.GetMetadataWorkspace(
connectionStringBuilder.Metadata,
metadata => MetadataWorkspaceHelper.Rewrite(
metadata,
EffortProviderConfiguration.ProviderInvariantName,
EffortProviderManifestTokens.Version1));
}