2011-02-14 73 views
1

我正在尝试为我的测试类找到一个初始化模拟存储库的通用方法。由于我有多个知识库,我试着用泛型来做。我有一个通用的仓库接口:有没有更好的方法来初始化使用泛型的模拟库?

public interface IRepository<T> where T: class 
{ 
    IQueryable<T> GetAll(); 
} 

我的静态初始化方法是这样的:

public static Mock<T> GetRepository<T, TK>(params TK[] items) where T: class, IRepository<TK> where TK: class 
{ 
    Mock<T> mock = new Mock<T>(); 
    mock.Setup(m => m.GetAll()).Returns(items.ToList().AsQueryable); 
    return mock; 
} 

要初始化我的存储库中的代码,我使用:

Mock<IRepository<Link>> linkRepository = UnitTestHelpers.GetRepository<IRepository<Link>, Link>(new[] { 
    new Link { LinkId = 1, Title = "Title 1", Created = DateTime.Now, Url = "http://google.com" }, 
    new Link { LinkId = 1, Title = "Title 2", Created = DateTime.Now, Url = "http://google.com" }, 
    new Link { LinkId = 1, Title = "Title 3", Created = DateTime.Now, Url = "http://google.com" } 
}); 

我觉得这是不这是最好的方法,因为我必须在GetRepository方法中指定两次链接。有没有更好的/更清洁的方式来做到这一点?

回答

1

是的,有一种更平滑的方式来实现这一点。如您所提到的Link类型参数是多余的,这是因为没有真正需要参数化通用IRepository<T>类型。试试这个

public static Mock<IRepository<T>> GetRepository<T>(params T[] items) where T: class { 
    Mock<IRepository<T>> mock = new Mock<IRepository<T>>(); 
    mock.Setup(m => m.GetAll()).Returns(items.ToList().AsQueryable); 
    return mock; 
} 

一些无关提示:

  • 删除该ToList()通话,除非真的需要 。增加了懒惰并提高了可读性。
  • 使用特定的DateTime而不是DateTime.Now来创建repeatable单元测试。
+1

感谢您的帮助。明天我会试试这个。也欣赏关于可重复测试的建议。 – b3n 2011-02-21 10:00:02

相关问题