我正在尝试实现一个扩展方法来初始化我的MVC3应用程序的Moq存储库。我有一个存储库界面:
public interface IRepository<TEntity> : IDisposable where TEntity : class
{
//Methods
}
我有几个类,例如UserRepository,它实现了这个接口:
public interface IUserRepository : IRepository<User>
{
//Specific methods for User repository
}
public class UserRepository : EfRepositoryBase<User>, IUserRepository
{
}
EfRepositoryBase是我的存储库基类,为我的存储库提供了通用方法。在我的单元测试中,我想为每种类型的存储库创建一个扩展方法来检索模拟存储库。我尝试添加这样的扩展方法:
public static class RepositoryHelpers
{
public static Mock<IRepository<T>> GetMockRepository<T>(this IRepository<T> repository, params T[] items) where T : class
{
Mock<IRepository<T>> mock = new Mock<IRepository<T>>();
mock.Setup(m => m.GetAll()).Returns(items.AsQueryable());
return mock;
}
}
然而,这似乎不起作用。我期望使用UserRepository.GetMockRepository(...)来检索初始化的模拟存储库,但该方法不会显示在UserRepository上。
更新
我让它像新的UserRepository()一样工作.GetMockRepository(),有没有办法让这个方法作为静态方法可用,所以我不需要新建一个UserRepository?
答案 0 :(得分:2)
扩展方法用于对象的实例,而不是为类型添加静态方法。
试试这个
(new UserRepository()).GetMockRepository(...)
答案 1 :(得分:0)
我让它像新的一样工作 UserRepository()。GetMockRepository() 有没有办法制作这种方法 可以作为静态方法使用,所以我不这样做 必须新建一个UserRepository吗?
这个怎么样......
public static class RepositoryHelpers<T> where T : class
{
public static Mock<IRepository<T>> GetMockRepository<T>(params T[] items)
{
Mock<IRepository<T>> mock = new Mock<IRepository<T>>();
mock.Setup(m => m.GetAll()).Returns(items.AsQueryable());
return mock;
}
}
用法:
var repositoryMock = RepositoryHelpers<User>.GetMockRepository();