2011-05-13 114 views
12

短的版本:C#单元测试

在这段视频中,斯科特·艾伦先生explains how to test a controller。 但他没有显示该课程的完整代码:FakeDbContext。 有人能帮我完成吗?他在视频中为“测试控制器”在06:15分钟演示了该课程。

加长版

在学校里我有一个选修课,我们学习C#。我的考试项目是使用MVC3的ASP网站。 为了快速学习,我看到了来自PluralSight的视频。我的问题是关于this video 中的一些代码他解释了如何测试控制器。所以我尝试: 我已拥有一个简单的索引方法的控制器:

public class Round1Controller : Controller 
{ 
    IDbContext _db; 

    public Round1Controller() 
    { 
     _db = new Entities(); 
    } 

    public Round1Controller(IDbContext db) 
    { 
     _db = db; 
    } 

    public ActionResult Index() 
    { 
     var model = _db.ELECTIVES.ToList(); 

     return View(model); 
    } 

正如你可以看到我已经尝试做一个背景。 索引方法是我想要测试的方法。 他接下来要做的是在测试项目中创建一个名为FakeDbContext的类。

但不幸的是,他只显示了代码的一部分,我用了很多小时试图找出他如何创建一个get方法到HashSet

这里是你从视频中可以看到代码:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using EESS.Models; 

namespace EESS.Tests 
{ 
class FakeDbContext : IDbContext 
{ 
    public IQueryable<Restaurant> Restaurants 
    { 
     get { return _map.Get<Restaurant>().asQueryable(); } 
     set { _map.Use<Restaurant>(value); } 
    } 
    public IQueryable<Review> Reviews 
    { 
     get { return _map.Get<Review>().asQueryable(); } 
     set { _map.Use<Review>(value); } 
    } 

    public int SaveChanges() 
    { 
     ChangesSaved = true; 
     return 0; 
    } 

    public bool ChangesSaved { get; set; } 

    public T Attach<T>(T entity) where T : class 
    { 
     _map.Get<T>().Add(entity); 
     return entity; 
    } 
    public T Add<T>(T entity) where T : class 
    { 
     _map.Get<T>().Add(entity); 
     return entity; 
    } 

    public T Delete<T>(T entity) where T : class 
    { 
     _map.Get<T>().Remove(entity); 
     return entity; 
    } 

    SetMap _map = new SetMap(); 

    class SetMap : KeyedCollection<Type, object> 
    { 
     public HashSet<T> Use<T>(IEnumerable<T> sourceData) 
     { 
      var set = new HashSet<T>(sourceData); 
      if (Contains(typeof(T))) 
      { 
       Remove(typeof(T)); 
      } 
      Add(set); 
      return set; 
     } 
    } 
} 
} 

要结束的长版,我的问题是我在_Map.Get得到一个错误。 Does not contain a definition or extension method

编辑!第2部分:

@xelibrion很好的回答后,它终于奏效了。

但后来出现了另一个问题。

的IDbContext类看起来是这样的:

public interface IDbContext 
    { 
     IQueryable<ELECTIVES> ELECTIVES { get; } 
     int SaveChanges(); 
     T Attach<T>(T entity) where T : class; 
     T Add<T>(T entity) where T : class; 
     T Delete<T>(T entity) where T : class; 
    } 

当我这个接口添加到我的实体类是offcouse希望我实现的方法。 PluralSight实现它们是这样的:

public DbSet<ELECTIVES> electives { get; set; } 

    IQueryable<ELECTIVES> IDbContext.ELECTIVES 
    { 
     get { return electives; } 
    } 

    int IDbContext.SaveChanges() 
    { 
     return SaveChanges(); 
    } 

    T IDbContext.Add<T>(T entity) 
    { 
     return Set<T>().Add(entity); 
    } 

    T IDbContext.Delete<T>(T entity) 
    { 
     return Set<T>().Remove(entity); 
    } 

    T IDbContext.Attach<T>(T entity) 
    { 

     var entry = Entry(entity); 
     entry.State = System.Data.EntityState.Modified; 
     return entity; 
     return Set<T>().Add(entity); 
    } 

但是从我的实体模型,我的“_dbModel.Designer.cs”类不知道什么套装和Entry是,只建议我做一个方法存根。这个类有更多的代码,所以如果需要请求其他的:)我已经改变了餐厅选修课,因为那个表名称我的数据库。

这是“使用”我忘记了吗?我再次看过视频,他的数据库类中没有方法存根。

+0

@casperOne感谢您的编辑。现在看起来更容易阅读!:) – 2011-05-13 20:52:18

+0

不是问题;没有什么个人反对“你好”和“谢谢你”,但一般[指导是不包括他们在帖子中](http://meta.stackexchange.com/questions/2950/should-hi-thanks-and-taglines-和称呼被移除从 - 个)。 – casperOne 2011-05-13 21:26:35

+0

@casperOne这很酷。只是似乎更多的“个人”,而不是只是抛出一个问题:) – 2011-05-13 21:33:52

回答

11

我想的setMap类的完整版应该是这样的

class SetMap : KeyedCollection<Type, object> 
{ 
    public HashSet<T> Use<T>(IEnumerable<T> sourceData) 
    { 
     var set = new HashSet<T>(sourceData); 
     if (Contains(typeof(T))) 
     { 
      Remove(typeof(T)); 
     } 
     Add(set); 
     return set; 
    } 

    public HashSet<T> Get <T>() 
    { 
     return (HashSet<T>) this[typeof(T)]; 
    } 

    protected override Type GetKeyForItem(object item) 
    { 
     return item.GetType().GetGenericArguments().Single(); 
    } 
} 
+0

找到。它看起来不错。我明天早上试试,看看它是否有效:)提前致谢! – 2011-05-13 22:05:59

+0

它很好用“:D非常感谢你!:DI希望你也许可以再次帮助我。我更新了主要问题的一部分2. – 2011-05-14 07:55:27

+0

我想从第二个问题设置()是SetMap的GET ( )和使用()方法,但我不知道什么入口方法是 – xelibrion 2011-05-15 18:18:14