EF をテストするときは、LINQ to Objects プロバイダーと LINQ to Entities プロバイダーの違いにより、ライブ DB に対して統合テストを使用する必要があると聞いています。
実際にクエリを実行せずに、クエリの構築を単体テストできないのはなぜですか? IQueryable を何らかの方法でLINQ to Entities プロバイダーにアタッチし、SQL が適切に生成されていることを確認できると思いました (実際のクエリを実行しない ToTraceString などを使用)。
これらの行に沿ったコードを想像します (このクエリは L2O では正常に実行されますが、L2E では実行されません)。
<Test()> _
Public Sub Query_Should_Build_Against_L2E()
Dim testQuery = From d In myDb
Where d.Status = CType(Status.Ready, Integer)
testQuery.SetQueryProvider("L2E")
Assert.DoesNotThrow(testQuery.ToTraceString())
End Sub
編集
GertArnold のソリューションを次のように実装しようとしました。
Dim context As New Context("Data Source=fakedbserver;Initial Catalog=fakedb;Persist Security Info=True;")
Dim result = context.myTable.Where(Function(d) d.Status=True)
ProviderIncompatibleException
これにより、「データベースからプロバイダー情報を取得中にエラーが発生しました。これは、不適切な接続文字列を使用した Entity Framework が原因である可能性があります。詳細については内部例外を確認し、接続文字列が正しいことを確認してください。」というメッセージがスローされます。完全な例外チェーンは次のとおりです。
System.Data.ProviderIncompatibleException : データベースからプロバイダー情報を取得中にエラーが発生しました。これは、不適切な接続文字列を使用する Entity Framework が原因である可能性があります。内部例外で詳細を確認し、接続文字列が正しいことを確認してください。
System.Data.ProviderIncompatibleException : プロバイダーは ProviderManifestToken 文字列を返しませんでした。
System.InvalidOperationException : この操作には、'master' データベースへの接続が必要です。元のデータベース接続が開かれており、資格情報が接続文字列から削除されているため、'master' データベースへの接続を作成できません。開かれていない接続を提供します。
System.Data.SqlClient.SqlException : SQL Server への接続を確立中に、ネットワーク関連またはインスタンス固有のエラーが発生しました。サーバーが見つからないか、アクセスできませんでした。インスタンス名が正しいこと、および SQL Server がリモート接続を許可するように構成されていることを確認してください。(プロバイダー: 名前付きパイプ プロバイダー、エラー: 40 - SQL Server への接続を開けませんでした)