技术开发 频道

基于MVC框架开发Web论坛之测试篇

  四、 创建论坛仓库类

  接下来,我们需要创建一个ForumRepository类。论坛应用程序将使用该ForumRepository类实现与数据库的交互。列表3提供了这个类的实例代码。
  列表3—Models\ForumRepository.cs
 

using MvcFakes;
using System.Linq;
using System.Data.Linq;
using LinqToSqlExtensions;
using Microsoft.Web.Mvc;
using System.Collections.Generic;

namespace MvcForums.Models
{
    
public class ForumRepository : IForumRepository
    {
        
private IDataContext _dataContext;

        
public ForumRepository()
            : this(
new DataContextWrapper("conForumsDB", "~/Models/ForumsDB.xml"))
        { }
        
        
public ForumRepository(IDataContext dataContext)
        {
            _dataContext
= dataContext;
        }

        
public IList<Message> SelectThreads()
        {
            var messages
= _dataContext.GetTable<Message>();
            var threads
= from m in messages
                          where m.ParentId
== null
                          
select m;
            return threads.ToList();
        }
    }
}

  首先注意到,上面这个ForumRepository类提供了一个名字为SelectTheads()的public方法。此方法负责返回所有的ParentId为NULL的消息。这个方法返回参数形式为一个IList—该列表集合实现IList接口。

  另外还应注意到,这个ForumRepository类支持构造器依赖性注入。这个类有两个构造器函数。如果你实例化该类,但是没有提供一个实现了IDataContext接口的类,那么ForumRepository类默认会使用一个DataContextWrapper类的实例(其中,DataContextWrapper类是一个添加了IDataContext接口的DataContext类的瘦包装器)。

  在单元测试,我们可以把一个虚构的DataContext传递到上面ForumRepository类的构造器中。通过这种方式,我们就可以对ForumRepository类进行测试而不必接触到实际的数据库。

  列表4给出了实现了IForumRepository接口的ForumRepository类的完整定义。
  列表4–Models\IForumRepository.cs
 

using Microsoft.Web.Mvc;
using MvcFakes;
using System.Collections.Generic;

namespace MvcForums.Models
{
    
public interface IForumRepository
    {
        IList
<Message> SelectThreads();
    }
}

  【注意】因为ForumRepository类中利用了LINQ to SQL技术,所以你必须在你的应用程序中添加一个对程序集System.Data.Linq的引用。

1
相关文章