2013-04-16 83 views
2

我正在爲我的通用存儲庫層寫單元測試,但我有一些問題DbEntityEntry嘲笑DbEntityEntry

我的更新方法如下所示。

public virtual void Update(TEntity entityToUpdate) { 
      var entity = dbSet.Find(context.Entry<ITrackedEntity>(entityToUpdate).Entity.Id); 
      context.Entry(entity).CurrentValues.SetValues(entityToUpdate); 
     } 

如您所見,context.Entry<TEntity>(TEntity entity)方法由調用者調用。所以,雖然單元測試此代碼會拋出空異常。

我試圖模擬context.Entry方法,但我不能,因爲我無法提供返回值。

我目前的測試方法是下面

[Fact] 
     public void UpdateTest() { 
      AssetType _sample1 = new AssetType() { 
       AssetTypeID = 1, 
       IsContainer = true, 
       Name = "Sample 1" 
      }; 

      IDbSet<AssetType> assetTypeDbSet = new FakeDbSet<AssetType>(_sample1); 

      Mock<IDbContext> mockContext = new Mock<IDbContext>(); 
      mockContext.Setup(pc => pc.Set<AssetType>()).Returns(assetTypeDbSet); 
      _sample1.Name = "Sample 1.1"; 

      var dbEntity = mockContext.Object.Entry<ITrackedEntity>(_sample1); 
      mockContext.Setup(p => p.Entry<ITrackedEntity>(It.IsAny<AssetType>())).Returns(dbEntity); 
      using(GenericRepository<AssetType> repo = new GenericRepository<AssetType>(mockContext.Object)) {     
       repo.Update(_sample1); 
       var result = repo.GetAll(0, 0); 
       Assert.Equal(1, result.Count); 
       var singleResult = repo.GetByID(1); 
       Assert.Equal(_sample1.Name, singleResult.Name); 
      } 
     } 

我試圖通過撥打測試context.Entry<>()方法來獲得DbEntityEntry值,但WA返回null了。 此類別不能與new運營商聯繫。所以我斯塔克..

回答

2

單元測試這個代碼有什麼意義?你假冒Find方法,那麼你假冒DbEntityEntry,並沒有真正的邏輯來測試。

總而言之,EF代碼不是單元可測試的。這就是爲什麼人們相信存儲庫會幫助他們的原因之一,因爲他們在測試上層時嘲笑/僞造他們的存儲庫。然後使用集成測試測試存儲庫,確保EF和數據庫中的所有內容按預期工作。

你不會假冒DbEntityEntry與Moq。也許用TypeMock Isolator或MS Fakes可以做更多的事情,但在示例代碼中並不需要它。

+0

嗯,我沒有那麼想。所以你建議我離開這個並寫集成測試,這將是我的下一步 –