2011-02-28 110 views
0

我想實現一個擴展方法來初始化我的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上。

UPDATE

我得到它像新的一樣UserRepository()工作。GetMockRepository(),有什麼辦法讓可以作爲一個靜態方法,所以我不這個方法有新的一個UserRepository?

回答

2

擴展方法用於對象的實例,而不是將靜態方法添加到類型。

試試這個

(new UserRepository()).GetMockRepository(...)
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(); 
+0

這就是我之前使用它的方式,我只是想我可以把它作爲一個擴展可用方法。 – b3n 2011-02-28 03:33:51