当前位置:  开发笔记 > 编程语言 > 正文

NHibernate测试,嘲笑ISession

如何解决《NHibernate测试,嘲笑ISession》经验,为你挑选了1个好方法。

我正在使用NHibernate和Rhinomocks,并且无法测试我想要的内容.我想在不命中数据库的情况下测试以下存储库方法(其中_session作为ISession注入到存储库中):

public class Repository : IRepository
{
    (... code snipped for brevity ...)

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

我最初的方法是模拟ISession,并在调用Linq时返回IQueryable存根(手动编码).我有一个客户对象的IList,我想在memeory中查询以测试我的Linq查询代码而不会访问db.我不确定这会是什么样子.我是否编写自己的IQueryable实现?如果是这样,有人为这种方法做了这个吗?或者我需要查看其他途径?

谢谢!



1> Garry Shutle..:

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

public interface IRepository
{
    IQueryable All();
    // whatever else you want
}

像这样轻松实现:

public IQueryable All()
{
    return session.Linq();
}

这意味着,而不是在存储库上调用您的方法,如:

var result = repository.FindBy(x => x.Id == 1);

你可以做:

var result = repository.All().Where(x => x.Id == 1);

或者LINQ语法:

var result = from instance in repository.All()
             where instance.Id == 1
             select instance;

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

正如您所指出的,这一点是让您测试查询的逻辑而不涉及数据库,这会大大减慢它们的速度.


在这种情况下拥有存储库有什么意义?
推荐阅读
郑小蒜9299_941611_G
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有