我正在关注从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