首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NHibernate测试,模拟ISession

NHibernate测试,模拟ISession
EN

Stack Overflow用户
提问于 2009-01-15 20:46:41
回答 2查看 4K关注 0票数 6

我正在使用NHibernate和Rhinomock,在测试我想要的东西时遇到了问题。我想在不命中数据库的情况下测试以下存储库方法(其中_session作为ISession注入到存储库):

代码语言:javascript
复制
public class Repository : IRepository
{
    (... code snipped for brevity ...)

    public T FindBy<T>(Expression<Func<T, bool>> where)
    {  
        return _session.Linq<T>().Where(where).FirstOrDefault();
    }
}

我最初的方法是模拟ISession,并在调用IQueryable时返回一个Linq存根(手工编码)。我有一个要在内存中查询的Customer对象的IList,以便在不命中数据库的情况下测试我的Linq查询代码。我不确定这会是什么样子。我是否要编写自己的IQueryable实现?如果是这样的话,是否有人为这种方法做了这样的事情?或者我需要寻找其他途径?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-01-15 22:19:20

我是如何完成这项测试的,不是将表达式传递给存储库,而是公开IQueryable,为存储库提供如下接口:

代码语言:javascript
复制
public interface IRepository<T>
{
    IQueryable<T> All();
    // whatever else you want
}

可以像这样轻松实现:

代码语言:javascript
复制
public IQueryable<T> All()
{
    return session.Linq<T>();
}

这意味着,不是像这样调用存储库上的方法:

代码语言:javascript
复制
var result = repository.FindBy(x => x.Id == 1);

您可以执行以下操作:

代码语言:javascript
复制
var result = repository.All().Where(x => x.Id == 1);

或LINQ语法:

代码语言:javascript
复制
var result = from instance in repository.All()
             where instance.Id == 1
             select instance;

这意味着您可以通过直接模拟存储库来获得相同的测试,这应该更容易。您只需让模拟程序返回您创建并调用AsQueryable()的列表即可。

正如您所指出的,这样做的目的是让您在不涉及数据库的情况下测试查询的逻辑,这会显著降低查询速度。

票数 7
EN

Stack Overflow用户

发布于 2009-01-15 21:44:08

从我的角度来看,这将被认为是集成测试。NHibernate有它自己的测试,它通过了,在我看来,你似乎正在尝试在你自己的测试套件中重复其中的一些测试。我要么将NHibernate代码和测试添加到您的项目中,并将其与他们的测试一起添加到那里,如果他们没有非常相似的测试方法,那么就使用他们的测试方法,或者将其转移到集成测试场景中并访问数据库。

如果只是因为您不想设置数据库来进行测试,那么您就走运了,因为您正在使用NHibernate。通过一些谷歌搜索,您可以找到相当多的示例,说明如何使用SQLite对数据库进行“某种”集成测试,但将其保留在内存中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/448405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档