2011-11-14 19 views
3

私はまずRhino Mocksを初めて使っていると言っています。Rhino Mocks - テストリポジトリレイヤが "オブジェクト参照がインスタンスに設定されていません"エラーを返します。エラー

これを念頭において私はdatacontextの正しいメソッドがヒットしていることと、LINQ to SQLが正しくフィルタリングされていることを確認するために、Linq to SQLリポジトリレイヤーをユニットテストしようとしています。

〜は、対象の方法〜

明瞭さのために編集 - 'GetRecordWhereが' - リポジトリクラスで定義されています。 DataContextWockpper上のメソッド - GetTableを呼び出します。DataContextWrapperは、DataContextをモック可能にするために実装されたLinq to SQL DataContext(自動生成)に対する私のカスタムラッパーです。

public interface IDataContextWrapper : IDisposable 
{ 
    IQueryable<TName> GetTable<TName>() where TName : class; 
} 

public class DataContextWrapper : IDataContextWrapper 
{ 
    public IQueryable<TName> GetTable<TName>() where TName : class 
    { 
     return _db.GetTable<TName>().AsQueryable(); 
    } 
} 

public class Repository : IRepository 
{ 
    public T GetRecordWhere<T>(Expression<Func<T, bool>> predicate) where T : class 
    { 
     return _dataContext.GetTable<T>().Where(predicate).SingleOrDefault(); 
    } 
} 

「GetRecordWhere」メソッドを使用してqueryedすることができ照会可能な結果セットを提供するために、「GetTable」メソッドをスタブしようとしたときに、私が現在直面していますエラーがスローされます。

ArgumentNullExcpetion:値はnullにはできません。

Arg<Expression<Func<Billing, bool>>>.Is.Anything 

..私もIs.NotNullと特定の述語で試してみました。

ユニットテストの例:

_dataContext = MockRepository.GenerateMock<IDataContextWrapper>(); 

    [Test] 
    public void GetRecordWhere() 
    { 
     // Arrange 
     var billing = new Billing { BillingId = 1 }; 
     var billingQueryList = new List<Billing> {billing}; 
     const int testId = 1; 

     _dataContext.Stub(x => x.GetTable<Billing>() 
       .Where(Arg<Expression<Func<Billing, bool>>>.Is.Anything) 
       .SingleOrDefault()) 
       .Return(billing); 

     _intRepository = new Repository(_dataContext); 

     // Act 
     var result = _intRepository.GetRecordWhere<Billing>(x => x.BillingId == testId); 

     // Assert 
     Assert.IsNotNull(result); 
     Assert.AreEqual(result.BillingId, testId); 
     _dataContext.AssertWasCalled(x => x.GetTable<Billing>()); 
    } 

これはRhinoMocksの私の理解では失敗していますか?

ご協力いただき誠にありがとうございます。

+0

この質問は非常に長くなっています.3つのアップデートがあります。あなたの質問の元の部分は、NullReferenceExceptionを取得しています。後でArgumentNullExceptionの取得について言及します。関連する部品だけで問題が完全に失敗した場合、質問とコードを再編集できますか? – PatrickSteele

+0

現在の問題とコードの説明でメインポストを更新 – M05Pr1mty

+0

私の答えを更新しました。 – PatrickSteele

答えて

3

Rhino.Mocksでモックする方法は、Rhino.Mocksを傍受して定義したスタブ/モックの動作を提供できるように、仮想である必要があります。 GetTableの定義を見ると、それは仮想ではないため、嘲笑することはできません。

UPDATE:

は "鎖" は、あなたの方法はあざけりしないでください。ちょうどあなたがメソッドが値を行い、返すようにしたいものを定義します。

_dataContext.Stub(x => x.GetTable<Billing>()).Return(billingQueryList.AsQueryable()); 

私はユニットテストに及び上記スタブのセットアップを使用してサンプルコードを接続し、テストは合格します。

+0

+1;クラスを嘲笑するのではなく、インターフェースを使うことができます。 – vcsjones

+0

例を挙げてください。 GetTable が定義されているクラスを含むインターフェイスで質問を更新しました。私はこのメソッドを模倣するとき、私は模擬 "datacontext"内に含まれているメソッドをスタブしています..それが意味をなさない... – M05Pr1mty

関連する問題