2012-04-18 97 views
0

我解決了我的問題,但我不確定爲什麼事情正在工作,而且因爲我總是想知道爲什麼事情會按照他們的方式工作。實體框架,通用知識庫和單元測試

好吧,我正在開發一個MVC 3應用程序,我正在使用一個通用的存儲庫,統一的DI和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

+0

我不會稱之爲解決問題。您正在下載所有項目並在客戶端執行過濾,這將影響您的應用程序性能。無論如何,請你分享一下你在測試中使用的代碼來配置模擬器嗎? – dmusial 2012-04-18 18:48:13

+0

數據如何被模擬?你是否正確設置了ID?就像dmusial說的那樣,代碼會很有幫助。 – Luke 2012-04-18 20:02:05

回答

1

由於從未設置CountyService以在致電GetById時返回正確的數據,您將得到空值。添加下面的代碼用於設置模擬,你會好去與GetById方法:

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

或將它與傳遞給評判任何參數的工作:

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

太棒了,就是這樣。進入單元測試的事情很重要。 – 2012-04-24 15:51:35