2016-05-09 8 views
-1

Entity Frameworkを使用してストアドプロシージャを呼び出し、クエリ結果を返すメソッドがあります。ストアドプロシージャの呼び出しの単位テスト

このメソッドの単体テストはどのように記述できますか?私はどのように呼び出しを呼び出し、値を返すか分からない。

ストアドプロシージャが私に3列を返しています。私が好きなこのような場合には

public VerifyUser VerifyUser(string accountKey) 
{ 
    try 
    { 
     LoansContext loansContext = new LoansContext(); 

     VerifyUser queryResult = null; 

     using (loansContext) 
     { 
      using (loansContext.Database.Connection) 
      { 
       loansContext.Database.Connection.Open(); 

       string sqlStatment = string.Format("{0} @AccountKey = '{1}'", "execute [Loan].[Proc_VerifyUser]", accountKey); 

       queryResult = loansContext.Database 
            .SqlQuery<VerifyUser>(sqlStatment) 
            .Single(); 
      } 
     } 
    } 
    catch (Exception exception) 
    { 
     LoansDomainTrace.Trace.Error(EventId.Retrieve, 
      () => string.Format("VerifyUser exception: {0}", exception.Message), exception); 
     throw; 
    } 
} 
+0

あなたは生のSQLをやっているので、接続を抽象化したり、クエリをチェックしたりするために、多くのインフラストラクチャを傍受して模擬しなければならないので、これを模倣することに多大な注意が必要だと思います。代わりにSQL LocalDBのようなものを使用してテスト・データベースをデプロイし、そのテスト・データベースへの接続文字列をテスト・クラスに渡して接続できるようにして、実際には "実際の"データベース。私は過去にこのアプローチを使用しました。データベースを必要とするので*純粋な単体テストではありませんが、反復可能ですべてローカルです –

+0

ユニットテストの動作。具体的にテストしようとしている動作は何ですか? * "_______ *を確認したい"という文を使用します。たとえば、そのコードで書かれたテストの中には、 "LoansDomainTrace.Trace.Error"が例外で呼び出されるのを確認したいが、元の例外はまだ修正されていない "*と*"私は 'VerifyUser('有効な入力で呼び出され、例外をスローすることができます)を確認したい "* –

+0

@Scott Chamberlain、私が見たいものの一つですメッセージのレコードの1つがヌルであるか値があります。 – Alma

答えて

1

ユニットへの私の方法のロジックをテストしてから、私は外部リソース(例えばDBS)から(あなたのケースVerifyUserに)テストするコードを分離。私は良い選択肢はin-memory EF providerのいくつかの種類ですが、はるかに一般的な方法はあなたのEFの実装を抽象化することです。いくつかの種類のリポジトリパターンがあります。この分離がなければ、あなたが書いたテストはユニットテストではなく統合です。

関連する問題