2012-04-18 14 views
0

私は自分の問題を解決しましたが、どうして物事がうまくいかないのか分からず、私はいつも物事がどのように機能するのかを知りたいので尋ねています。エンティティフレームワーク、汎用リポジトリ、ユニットテスト

私はMVC 3アプリケーションを開発しています。一般的なリポジトリ、DIの場合は1、ユニットテストの場合はmoqを利用しています。アイテムを編集するための私のユニットテストでは、私のコントローラは、最初は次のようにこれを持っていました: AnEntity obj = _anEntityService.GetById(id);

しかし、ユニットテストでコントローラのEdit(1)が呼び出されていたときにnullが返されました。私が読み込みを変更したとき AnEntity obj = _anEntityService.GetAll()。FirstOrDefault(p => p.Id == id);

不正なアイテムが正しく返されました。

今、私はそれを理解してうれしいですが、私はまだユニットテストのために働いていたのですが、GetByIdは私がアプリケーションを実行していたときに働いていました。

ほとんどの洞察が役立ちます。

ありがとうございます。ここで

は嘲笑のデータである。ここでは

public class AdministrationMockData 
{ 
    #region Administration Mock Data 
    #region County Mock Data 
    public static void CreateCounty(ref Mock<ICountyService> mock) 
    { 
     mock.Setup(m => m.GetAll()).Returns(new List<County> 
     { 
    new County { Id = 1, Name = "Adams", StateId = 39, IsActive = true, LastChangedDate = DateTime.Now, LastChangedBy = "dba", AddedDate = DateTime.Now, AddedBy = "dba" }, 
    new County { Id = 2, Name = "Berks", StateId = 39, IsActive = true, LastChangedDate = DateTime.Now, LastChangedBy = "dba", AddedDate = DateTime.Now, AddedBy = "dba" }, 
    new County { Id = 3, Name = "Chester", StateId = 39, IsActive = true, LastChangedDate = DateTime.Now, LastChangedBy = "dba", AddedDate = DateTime.Now, AddedBy = "dba" }, 
    new County { Id = 4, Name = "York", StateId = 39, IsActive = true, LastChangedDate = DateTime.Now, LastChangedBy = "dba", AddedDate = DateTime.Now, AddedBy = "dba" }, 
    new County { Id = 5, Name = "Baltimore", StateId = 21, IsActive = true, LastChangedDate = DateTime.Now, LastChangedBy = "dba", AddedDate = DateTime.Now, AddedBy = "dba" }, 
    new County { Id = 6, Name = "Montgomery", StateId = 21, IsActive = true, LastChangedDate = DateTime.Now, LastChangedBy = "dba", AddedDate = DateTime.Now, AddedBy = "dba" } 
    }.AsQueryable()); 
    } 
    #endregion County Mock Data 

    #region State Mock Data 
    public static void CreateState(ref Mock<IStateService> mock) 
    { 
     mock.Setup(m => m.GetAll()).Returns(new List<State> 
     { 
    new State { Id = 21, Name = "Maryland", Code = "MD", IsActive = true, LastChangedDate = DateTime.Now, LastChangedBy = "dba", AddedDate = DateTime.Now, AddedBy = "dba" }, 
    new State { Id = 39, Name = "Pennsylvania", Code = "PA", IsActive = true, LastChangedDate = DateTime.Now, LastChangedBy = "dba", AddedDate = DateTime.Now, AddedBy = "dba" }   
    }.AsQueryable()); 
    } 
    #endregion State Mock Data 
    #endregion Administration Mock Data 
} 

はここで編集

[TestMethod] 
    public void Can_Edit_County() 
    { 
     // Arrange 
     // - create the mock repositories 
     Mock<ICountyService> mockCounty = new Mock<ICountyService>(); 
     Mock<IStateService> mockState = new Mock<IStateService>(); 
     AdministrationMockData.CreateCounty(ref mockCounty); 
     AdministrationMockData.CreateState(ref mockState); 

     // Arrange 
     // - create a controller and make the page size 6 items 
     CountyController controller = new CountyController(mockCounty.Object, mockState.Object); 
     controller.PageSize = 6; 
     controller.Testing = true; 

     // Act 
     County c1 = controller.Edit(1).ViewData.Model as County; 
     County c2 = controller.Edit(2).ViewData.Model as County; 
     County c3 = controller.Edit(3).ViewData.Model as County; 

     // Assert 
     Assert.AreEqual(1, c1.Id); 
     Assert.AreEqual(2, c2.Id); 
     Assert.AreEqual(3, c3.Id); 
    } 

ためのユニットテストでコントローラ編集ルーチンれる:

public ViewResult Edit(int id) 
    { 
     //County obj = _countyService.GetById(id); 
     County obj = _countyService.GetAll().FirstOrDefault(p => p.Id == id); 
     if (!Testing) 
     { 
      PopulateCountyDropDownLists(obj.StateId); 
     } 
     return View(obj); 
    } 

私は一般的なリポジトリを持っています特定のエンティティごとにTEntityによってインスタンス化され、サービスを持つインタフェースリポジトリリポジトリを実行するためのインタフェースサービスを提供します。私のリポジトリとサービスは、GetByIdを呼び出すときにCountyServiceが決して適切なデータを返さないように設定していないため、ヌルになります。http://efmvc.codeplex.com/releases/view/58663

+0

I問題を解決するとは言わない。すべてのアイテムをダウンロードし、クライアント側でフィルタリングを実行すると、アプリケーションのパフォーマンスに影響します。とにかく、モックを構成するためにテストで使用したコードを共有していただけますか? – dmusial

+0

データはどうやってモックアップされていますか? IDを正しく設定していますか? dmusialのように、コードは役に立ちます。 – Luke

答えて

1

モックをセットアップするため、以下のコードを追加すると、GetById方法で行ってもいいでしょう:

mock.Setup(m => m.GetById(1).Returns(new State { Id = 1, ... }); 

またはそれを設定優先mothodに渡される引数を指定して動作するように:

mock.Setup(m => m.GetById(It.IsAny<int>()).Returns(new State { ... }); 
+0

すごい、それはそれをしました。それが重要なので、単体テストのものに入るだけです。 –

関連する問題