0

私は自分の問題を解決しましたが、なぜ物事が機能しているのかわからず、物事がそのように機能する理由を常に知りたいので、質問しています。

わかりました。MVC3アプリケーションを開発しており、ジェネリックリポジトリ、DI用のUnity、単体テスト用の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によってインスタンス化される汎用リポジトリとインターフェイスリポジトリがあり、リポジトリを実行するためのサービスとインターフェイスサービスもあります。私のリポジトリとサービスは以下に基づいています:http://efmvc.codeplex.com/releases/view/58663

4

1 に答える 1

1

CountyServiceを呼び出すときに適切なデータを返すように設定していないため、null になりますGetById。モックを設定するために以下のコードを追加すると、GetByIdメソッドを使用できるようになります。

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

または、メソッドに渡された任意の引数で動作するように設定します。

mock.Setup(m => m.GetById(It.IsAny<int>()).Returns(new State { ... });
于 2012-04-22T17:48:45.277 に答える