2011-03-06 67 views
2

有沒有使用Rhino Mocks生成存根的方法IObjectSet<T>嘲笑IObjectSet <T>與Rhino Mocks

什麼是點以後是像下面的代碼:

var context = MockRepository.GenerateMock <IContext>(); 
//generate stub 
var mockProjectObjectSet = MockRepository.GenerateStub<IObjectSet<Project>>(); 
TestObjectSets.GenerateFakeProjectList(mockProjectObjectSet); 
context.Expect(p => p.Projects).Return(mockProjectObjectSet); 
var projectRepository = new ProjectRepository(context); 

GenerateFakeProjectList靜態輔助方法,我簡單地創建指定類型的對象,並通過AddObject方法對它們添加到存根IObjectSet

public static IObjectSet<Project> GenerateFakeProjectList(IObjectSet<Project> projectsObjectSet) 
{  
    projectsObjectSet.AddObject(new Project() 
    { 
    Categories = null, 
    DateCreated = DateTime.Now.AddDays(-10), 
    ....... 

回答

2

我會使用一個具體的實例,或一個簡單的假。該接口有少量的方法,實現看起來微不足道。嘲笑該接口只會增加不必要的複雜性。

+0

嗨Ritch,我想我必須硬着頭皮製作假混凝土類。感謝指針。 – 2011-03-07 20:06:03

+0

是的,Mocking是手工維護一堆假貨和處理Mock框架之間的一種折衷。如果類型很簡單,我會嘗試直接使用它並使用xUnit test-assertions。如果沒有,那麼我嘲笑並使用模擬框架的斷言。 – 2011-03-07 20:48:56

1

由於你在模擬一個接口,所以沒有實際的代碼。剛剛成立了一個存根爲你的接口,然後踩滅的項目屬性返回你想要什麼(我假設Projects是一個屬性,但不包括項目類的定義)。

像這樣的東西應該工作:

var stubSet = MockRepository.GenerateStub<IObjectSet<Project>>(); 
stubSet.Stub(s => s.Projects).Return(new[] 
               { 
                new Project {Categories = null}, 
                new Project {Categories = "abc"} 
               }); 
+0

帕特里克。感謝您的輸入。可悲的項目不是一個財產;所以我無法使用你的方法。但是,對於我來說,瞭解您爲其他情景提供的語法很好。 – 2011-03-07 20:05:08

+0

格蘭特出於好奇,什麼是「項目」? – PatrickSteele 2011-03-07 22:12:09

5

我知道我遲到了這個晚會,但這裏有一個簡單的實施IObjectSet<T>,我曾經使用過。我忘了我從哪裏得到它:

public class MockObjectSet<T> : IObjectSet<T> where T : class { 
     readonly List<T> _container = new List<T>(); 

     public void AddObject(T entity) { 
      _container.Add(entity); 
     } 

     public void Attach(T entity) { 
      _container.Add(entity); 
     } 

     public void DeleteObject(T entity) { 
      _container.Remove(entity); 
     } 

     public void Detach(T entity) { 
      _container.Remove(entity); 
     } 

     public IEnumerator<T> GetEnumerator() { 
      return _container.GetEnumerator(); 
     } 

     IEnumerator IEnumerable.GetEnumerator() { 
      return _container.GetEnumerator(); 
     } 

     public Type ElementType { 
      get { return typeof(T); } 
     } 

     public System.Linq.Expressions.Expression Expression { 
      get { return _container.AsQueryable<T>().Expression; } 
     } 

     public IQueryProvider Provider { 
      get { return _container.AsQueryable<T>().Provider; } 
     } 
    }