我正在關注從a previous question。我接受的答案涉及使用通用的IRepository
來處理基本的CRUD,其中包含域指定的IMovieRepository
,它委託給通用設置。進一步的細節包括其在通用IRepository
一個WrapQueryInSession
方法:單元測試應該知道NHibernate嗎?
IEnumerable<T> WrapQueryInSession(Func<ISession, IEnumerable<T>> query);
我得到落實時,我意識到,這暴露了NHibernate的ISession
消費者的一般存儲庫。 NHibernate完全包含在IRepository
實現中,但對於該方法簽名。
本就浮出水面時,我想單元測試MovieRepository
,由具有IRepository
,在RepositoryFake
實施,傳遞給MovieRepository
構造:
protected override void BeforeEachTest()
{
_fixture = new MovieRepository(new RepositoryFake());
}
我的測試類有一個私有假倉庫實現:
private class RepositoryFake : IRepository<Movie>
{
...
public IEnumerable<Movie> WrapQueryInSession(Func<ISession, IEnumerable<Movie>> query)
{
...
}
...
}
這樣設置的方式,測試類和IRepository
實現的任何其他使用者知道來自NHibernate的,以及NHibernate本身。這似乎是一個漏洞抽象的例子。
有沒有更好的方法來完全包含在一個IRepository
實現中使用NHibernate?
我沒有想到這樣的說法,但現在它開始合理。這就像一個謎題:碎片正在放置,圖片現在正在形成:) – 2010-08-30 05:37:21
從另一方面來看,一旦我有了這個釘子,我應該可以創建一個模板用於其他項目。 – 2010-08-30 05:46:15